1908164b1f237b5c6b51d934ebccf4ea6749a9c8
3 from migen
.fhdl
.std
import *
4 from migen
.genlib
.record
import *
5 from migen
.sim
.generic
import run_simulation
7 from lib
.sata
.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)
39 class PacketStreamer(Module
):
40 def __init__(self
, description
, packet_class
):
41 self
.source
= Source(description
)
44 self
.packet
= packet_class()
47 def send(self
, packet
, blocking
=True):
48 packet
= copy
.deepcopy(packet
)
49 self
.packets
.append(packet
)
51 while packet
.done
== 0:
54 def do_simulation(self
, selfp
):
55 if len(self
.packets
) and self
.packet
.done
:
56 self
.packet
= self
.packets
.pop(0)
57 if not self
.packet
.ongoing
and not self
.packet
.done
:
60 if len(self
.packet
) > 0:
61 if hasattr(selfp
.source
, "data"):
62 selfp
.source
.data
= self
.packet
.pop(0)
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 if hasattr(selfp
.source
, "data"):
72 selfp
.source
.data
= self
.packet
.pop(0)
74 selfp
.source
.d
= self
.packet
.pop(0)
79 class PacketLogger(Module
):
80 def __init__(self
, description
, packet_class
):
81 self
.sink
= Sink(description
)
83 self
.packet_class
= packet_class
84 self
.packet
= packet_class()
88 while self
.packet
.done
== 0:
91 def do_simulation(self
, selfp
):
93 if selfp
.sink
.stb
== 1 and selfp
.sink
.sop
== 1:
94 self
.packet
= self
.packet_class()
96 if hasattr(selfp
.sink
, "data"):
97 self
.packet
.append(selfp
.sink
.data
)
99 self
.packet
.append(selfp
.sink
.d
)
100 if selfp
.sink
.stb
== 1 and selfp
.sink
.eop
== 1:
101 self
.packet
.done
= True
103 class AckRandomizer(Module
):
104 def __init__(self
, description
, level
=0):
107 self
.sink
= Sink(description
)
108 self
.source
= Source(description
)
114 Record
.connect(self
.sink
, self
.source
)
116 self
.source
.stb
.eq(0),
120 def do_simulation(self
, selfp
):