3 from liteeth
.common
import *
4 from liteeth
.test
.common
import *
6 from liteeth
.test
.model
import udp
8 def print_etherbone(s
):
9 print_with_prefix(s
, "[ETHERBONE]")
13 def __init__(self
, data
):
17 return "Write data : {}".format(self
.data
)
21 def __init__(self
, addr
):
25 return "Read addr : {}".format(self
.addr
)
27 class EtherboneWrites(Packet
):
28 def __init__(self
, init
=[], base_addr
=0):
29 Packet
.__init
__(self
, init
)
30 self
.base_addr
= base_addr
34 self
.writes
.append(write
)
37 for byte
in split_bytes(self
.base_addr
, 4):
39 for write
in self
.writes
:
40 for byte
in split_bytes(write
.data
, 4):
46 base_addr
.append(self
.pop(0))
47 self
.base_addr
= merge_bytes(base_addr
)
52 write
.append(self
.pop(0))
53 self
.writes
.append(EtherboneWrite(merge_bytes(write
)))
55 class EtherboneReads(Packet
):
56 def __init__(self
, init
=[], base_ret_addr
=0):
57 Packet
.__init
__(self
, init
)
58 self
.base_ret_addr
= base_ret_addr
62 self
.reads
.append(read
)
65 for byte
in split_bytes(self
.base_ret_addr
, 4):
67 for read
in self
.reads
:
68 for byte
in split_bytes(read
.addr
, 4):
74 base_ret_addr
.append(self
.pop(0))
75 self
.base_ret_addr
= merge_bytes(base_ret_addr
)
80 read
.append(self
.pop(0))
81 self
.reads
.append(EtherboneRead(merge_bytes(read
)))
83 class EtherboneRecord(Packet
):
84 def __init__(self
, init
=[]):
85 Packet
.__init
__(self
, init
)
94 for i
in range((self
.wcount
+1)*4):
95 writes
.append(self
.pop(0))
96 return EtherboneWrites(writes
)
103 for i
in range((self
.rcount
+1)*4):
104 reads
.append(self
.pop(0))
105 return EtherboneReads(reads
)
109 for byte
in self
[:etherbone_record_header_len
]:
110 header
.append(self
.pop(0))
111 for k
, v
in sorted(etherbone_record_header
.items()):
112 setattr(self
, k
, get_field_data(v
, header
))
114 def set_writes(self
, writes
):
119 self
.wcount
= len(writes
)-4
121 def set_reads(self
, reads
):
126 self
.rcount
= len(reads
)-4
130 for k
, v
in sorted(etherbone_record_header
.items()):
131 value
= merge_bytes(split_bytes(getattr(self
, k
), math
.ceil(v
.width
/8)), "little")
132 header
+= (value
<< v
.offset
+(v
.byte
*8))
133 for d
in split_bytes(header
, etherbone_record_header_len
):
138 for k
in sorted(etherbone_record_header
.keys()):
139 r
+= k
+ " : 0x%x" %getattr
(self
,k
) + "\n"
145 class EtherbonePacket(Packet
):
146 def __init__(self
, init
=[]):
147 Packet
.__init
__(self
, init
)
149 def get_records(self
):
153 while len(payload
) != 0:
154 record
= EtherboneRecord(payload
)
156 records
.append(copy
.deepcopy(record
))
157 writes
= record
.get_writes()
158 reads
= record
.get_reads()
164 for byte
in self
[:etherbone_header_len
]:
165 header
.append(self
.pop(0))
166 for k
, v
in sorted(etherbone_header
.items()):
167 setattr(self
, k
, get_field_data(v
, header
))
169 def set_records(self
, records
):
170 self
.records
= records
171 for record
in records
:
177 for k
, v
in sorted(etherbone_header
.items()):
178 value
= merge_bytes(split_bytes(getattr(self
, k
), math
.ceil(v
.width
/8)), "little")
179 header
+= (value
<< v
.offset
+(v
.byte
*8))
180 for d
in split_bytes(header
, etherbone_header_len
):
185 for k
in sorted(etherbone_header
.keys()):
186 r
+= k
+ " : 0x%x" %getattr
(self
,k
) + "\n"
192 class Etherbone(Module
):
193 def __init__(self
, udp
, debug
=False):
197 self
.tx_packet
= EtherbonePacket()
198 self
.rx_packet
= EtherbonePacket()
200 self
.udp
.set_etherbone_callback(self
.callback
)
202 def send(self
, packet
):
205 print_etherbone(">>>>>>>>")
206 print_etherbone(packet
)
207 udp_packet
= udp
.UDPPacket(packet
)
208 udp_packet
.src_port
= 0x1234
209 udp_packet
.dst_port
= 0x5678
210 udp_packet
.length
= len(packet
)
211 udp_packet
.checksum
= 0
212 self
.udp
.send(udp_packet
)
214 def callback(self
, packet
):
215 packet
= Etherbone(packet
)
218 print_etherbone("<<<<<<<<")
219 print_etherbone(packet
)
222 def process(self
, packet
):
225 if __name__
== "__main__":
227 writes
= EtherboneWrites(base_addr
=0x1000)
229 writes
.add(EtherboneWrite(i
))
230 reads
= EtherboneReads(base_ret_addr
=0x2000)
232 reads
.add(EtherboneRead(i
))
235 record
= EtherboneRecord()
236 record
.set_writes(writes
)
237 record
.set_reads(reads
)
244 record
.byte_enable
= 0
250 packet
= EtherbonePacket()
251 packet
.set_records([record
for i
in range(8)])
252 packet
.magic
= etherbone_magic
253 packet
.version
= etherbone_version
257 packet
.addr_size
= 32//8
258 packet
.port_size
= 32//8
262 # Send packet over UDP to check against Wireshark dissector
264 sock
= socket
.socket(socket
.AF_INET
, socket
.SOCK_DGRAM
)
265 sock
.sendto(bytes(packet
), ("192.168.1.1", 20000))
267 packet
= EtherbonePacket(packet
)
272 records
= packet
.get_records()
273 for record
in records
:
274 writes
= record
.get_writes()
276 print(writes
.base_addr
)
277 for e
in writes
.writes
:
279 reads
= record
.get_reads()
281 print(reads
.base_ret_addr
)
282 for e
in reads
.reads
: