3 from migen
.fhdl
.std
import *
4 from migen
.flow
.actor
import Sink
, Source
5 from migen
.genlib
.record
import *
7 from misoclib
.ethmac
.common
import *
9 def seed_to_data(seed
, random
=True):
11 return (seed
* 0x31415979 + 1) & 0xffffffff
16 p1
= copy
.deepcopy(p1
)
17 p2
= copy
.deepcopy(p2
)
18 if isinstance(p1
, int):
19 return 0, 1, int(p1
!= p2
)
21 if len(p1
) >= len(p2
):
26 while((ref
[0] != res
[0]) and (len(res
)>1)):
29 length
= min(len(ref
), len(res
))
31 for i
in range(length
):
32 if ref
.pop(0) != res
.pop(0):
34 return shift
, length
, errors
37 return random
.randint(0, max_n
-1)
40 def __init__(self
, init
=[]):
46 class PacketStreamer(Module
):
47 def __init__(self
, description
):
48 self
.source
= Source(description
)
51 self
.packet
= Packet()
54 def send(self
, packet
):
55 packet
= copy
.deepcopy(packet
)
56 self
.packets
.append(packet
)
58 def do_simulation(self
, selfp
):
59 if len(self
.packets
) and self
.packet
.done
:
60 self
.packet
= self
.packets
.pop(0)
61 if not self
.packet
.ongoing
and not self
.packet
.done
:
64 selfp
.source
.d
= self
.packet
.pop(0)
65 self
.packet
.ongoing
= True
66 elif selfp
.source
.stb
== 1 and selfp
.source
.ack
== 1:
68 selfp
.source
.eop
= (len(self
.packet
) == 1)
69 if len(self
.packet
) > 0:
71 selfp
.source
.d
= self
.packet
.pop(0)
76 class PacketLogger(Module
):
77 def __init__(self
, description
):
78 self
.sink
= Sink(description
)
80 self
.packet
= Packet()
84 while self
.packet
.done
== 0:
87 def do_simulation(self
, selfp
):
89 if selfp
.sink
.stb
== 1 and selfp
.sink
.sop
== 1:
90 self
.packet
= Packet()
91 self
.packet
.append(selfp
.sink
.d
)
93 self
.packet
.append(selfp
.sink
.d
)
94 if selfp
.sink
.stb
== 1 and selfp
.sink
.eop
== 1:
95 self
.packet
.done
= True
97 class AckRandomizer(Module
):
98 def __init__(self
, description
, level
=0):
101 self
.sink
= Sink(description
)
102 self
.source
= Source(description
)
108 Record
.connect(self
.sink
, self
.source
)
110 self
.source
.stb
.eq(0),
114 def do_simulation(self
, selfp
):