digsim-logic-simulator 0.22.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- digsim/__init__.py +6 -0
- digsim/app/__main__.py +12 -0
- digsim/app/cli.py +68 -0
- digsim/app/gui/__init__.py +6 -0
- digsim/app/gui/_circuit_area.py +468 -0
- digsim/app/gui/_component_selection.py +154 -0
- digsim/app/gui/_main_window.py +163 -0
- digsim/app/gui/_top_bar.py +339 -0
- digsim/app/gui/_utils.py +26 -0
- digsim/app/gui/_warning_dialog.py +46 -0
- digsim/app/gui_objects/__init__.py +7 -0
- digsim/app/gui_objects/_bus_bit_object.py +94 -0
- digsim/app/gui_objects/_buzzer_object.py +97 -0
- digsim/app/gui_objects/_component_context_menu.py +79 -0
- digsim/app/gui_objects/_component_object.py +374 -0
- digsim/app/gui_objects/_component_port_item.py +63 -0
- digsim/app/gui_objects/_dip_switch_object.py +104 -0
- digsim/app/gui_objects/_gui_note_object.py +80 -0
- digsim/app/gui_objects/_gui_object_factory.py +80 -0
- digsim/app/gui_objects/_hexdigit_object.py +53 -0
- digsim/app/gui_objects/_image_objects.py +239 -0
- digsim/app/gui_objects/_label_object.py +97 -0
- digsim/app/gui_objects/_logic_analyzer_object.py +86 -0
- digsim/app/gui_objects/_seven_segment_object.py +131 -0
- digsim/app/gui_objects/_shortcut_objects.py +82 -0
- digsim/app/gui_objects/_yosys_object.py +32 -0
- digsim/app/gui_objects/images/AND.png +0 -0
- digsim/app/gui_objects/images/Analyzer.png +0 -0
- digsim/app/gui_objects/images/BUF.png +0 -0
- digsim/app/gui_objects/images/Buzzer.png +0 -0
- digsim/app/gui_objects/images/Clock.png +0 -0
- digsim/app/gui_objects/images/DFF.png +0 -0
- digsim/app/gui_objects/images/DIP_SWITCH.png +0 -0
- digsim/app/gui_objects/images/FlipFlop.png +0 -0
- digsim/app/gui_objects/images/IC.png +0 -0
- digsim/app/gui_objects/images/LED_OFF.png +0 -0
- digsim/app/gui_objects/images/LED_ON.png +0 -0
- digsim/app/gui_objects/images/MUX.png +0 -0
- digsim/app/gui_objects/images/NAND.png +0 -0
- digsim/app/gui_objects/images/NOR.png +0 -0
- digsim/app/gui_objects/images/NOT.png +0 -0
- digsim/app/gui_objects/images/ONE.png +0 -0
- digsim/app/gui_objects/images/OR.png +0 -0
- digsim/app/gui_objects/images/PB.png +0 -0
- digsim/app/gui_objects/images/Switch_OFF.png +0 -0
- digsim/app/gui_objects/images/Switch_ON.png +0 -0
- digsim/app/gui_objects/images/XNOR.png +0 -0
- digsim/app/gui_objects/images/XOR.png +0 -0
- digsim/app/gui_objects/images/YOSYS.png +0 -0
- digsim/app/gui_objects/images/ZERO.png +0 -0
- digsim/app/images/app_icon.png +0 -0
- digsim/app/model/__init__.py +6 -0
- digsim/app/model/_model.py +210 -0
- digsim/app/model/_model_components.py +162 -0
- digsim/app/model/_model_new_wire.py +57 -0
- digsim/app/model/_model_objects.py +155 -0
- digsim/app/model/_model_settings.py +35 -0
- digsim/app/model/_model_shortcuts.py +72 -0
- digsim/app/settings/__init__.py +8 -0
- digsim/app/settings/_component_settings.py +415 -0
- digsim/app/settings/_gui_settings.py +71 -0
- digsim/app/settings/_shortcut_dialog.py +39 -0
- digsim/circuit/__init__.py +7 -0
- digsim/circuit/_circuit.py +329 -0
- digsim/circuit/_waves_writer.py +61 -0
- digsim/circuit/components/__init__.py +26 -0
- digsim/circuit/components/_bus_bits.py +68 -0
- digsim/circuit/components/_button.py +44 -0
- digsim/circuit/components/_buzzer.py +45 -0
- digsim/circuit/components/_clock.py +54 -0
- digsim/circuit/components/_dip_switch.py +73 -0
- digsim/circuit/components/_flip_flops.py +99 -0
- digsim/circuit/components/_gates.py +246 -0
- digsim/circuit/components/_hexdigit.py +82 -0
- digsim/circuit/components/_ic.py +36 -0
- digsim/circuit/components/_label_wire.py +167 -0
- digsim/circuit/components/_led.py +18 -0
- digsim/circuit/components/_logic_analyzer.py +60 -0
- digsim/circuit/components/_mem64kbyte.py +42 -0
- digsim/circuit/components/_memstdout.py +37 -0
- digsim/circuit/components/_note.py +25 -0
- digsim/circuit/components/_on_off_switch.py +54 -0
- digsim/circuit/components/_seven_segment.py +28 -0
- digsim/circuit/components/_static_level.py +28 -0
- digsim/circuit/components/_static_value.py +44 -0
- digsim/circuit/components/_yosys_atoms.py +1353 -0
- digsim/circuit/components/_yosys_component.py +232 -0
- digsim/circuit/components/atoms/__init__.py +23 -0
- digsim/circuit/components/atoms/_component.py +280 -0
- digsim/circuit/components/atoms/_digsim_exception.py +8 -0
- digsim/circuit/components/atoms/_port.py +398 -0
- digsim/circuit/components/ic/74162.json +1331 -0
- digsim/circuit/components/ic/7448.json +834 -0
- digsim/storage_model/__init__.py +7 -0
- digsim/storage_model/_app.py +58 -0
- digsim/storage_model/_circuit.py +126 -0
- digsim/synth/__init__.py +6 -0
- digsim/synth/__main__.py +67 -0
- digsim/synth/_synthesis.py +156 -0
- digsim/utils/__init__.py +6 -0
- digsim/utils/_yosys_netlist.py +134 -0
- digsim_logic_simulator-0.22.0.dist-info/METADATA +140 -0
- digsim_logic_simulator-0.22.0.dist-info/RECORD +107 -0
- digsim_logic_simulator-0.22.0.dist-info/WHEEL +5 -0
- digsim_logic_simulator-0.22.0.dist-info/entry_points.txt +2 -0
- digsim_logic_simulator-0.22.0.dist-info/licenses/LICENSE.md +32 -0
- digsim_logic_simulator-0.22.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1353 @@
|
|
|
1
|
+
# Copyright (c) Fredrik Andersson, 2023-2024
|
|
2
|
+
# All rights reserved
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
Module with yosys atom component classes
|
|
6
|
+
|
|
7
|
+
All components are implemented from the specification in:
|
|
8
|
+
https://github.com/YosysHQ/yosys/blob/master/techlibs/common/simcells.v
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from .atoms import Component, DigsimException, PortIn, PortOutDelta, PortWire
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class YosysNotImplementedException(DigsimException):
|
|
15
|
+
"""Exception for not implemented components"""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ClassNameParameterComponent(Component):
|
|
19
|
+
"""
|
|
20
|
+
Helper class to get active level and edges from class name
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def name_to_level(self, index):
|
|
24
|
+
"""
|
|
25
|
+
Helper function to convert a specific position in the class name
|
|
26
|
+
to a logic level:
|
|
27
|
+
N/0 ==> 0
|
|
28
|
+
P/1 ==> 1
|
|
29
|
+
"""
|
|
30
|
+
class_name = self.__class__.__name__
|
|
31
|
+
split = class_name.split("_")
|
|
32
|
+
level = split[2][index]
|
|
33
|
+
if level in ["N", "0"]:
|
|
34
|
+
return 0
|
|
35
|
+
if level in ["P", "1"]:
|
|
36
|
+
return 1
|
|
37
|
+
raise ValueError(f"Unknown value ä{level}'")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class _BUF_(Component):
|
|
41
|
+
"""module _BUF_ (A, Y)"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, circuit, name=None):
|
|
44
|
+
super().__init__(circuit, name)
|
|
45
|
+
self.add_port(PortIn(self, "A"))
|
|
46
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
47
|
+
|
|
48
|
+
def update(self):
|
|
49
|
+
self.Y.value = self.A.value
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class _NOT_(Component):
|
|
53
|
+
"""module _NOT_ (A, Y)"""
|
|
54
|
+
|
|
55
|
+
def __init__(self, circuit, name=None):
|
|
56
|
+
super().__init__(circuit, name)
|
|
57
|
+
self.add_port(PortIn(self, "A"))
|
|
58
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
59
|
+
|
|
60
|
+
def update(self):
|
|
61
|
+
if self.A.value == 1:
|
|
62
|
+
self.Y.value = 0
|
|
63
|
+
else:
|
|
64
|
+
self.Y.value = 1
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class _AND_(Component):
|
|
68
|
+
"""module _AND_ (A, B, Y)"""
|
|
69
|
+
|
|
70
|
+
def __init__(self, circuit, name=None):
|
|
71
|
+
super().__init__(circuit, name)
|
|
72
|
+
self.add_port(PortIn(self, "A"))
|
|
73
|
+
self.add_port(PortIn(self, "B"))
|
|
74
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
75
|
+
|
|
76
|
+
def update(self):
|
|
77
|
+
if self.A.value == 1 and self.B.value == 1:
|
|
78
|
+
self.Y.value = 1
|
|
79
|
+
else:
|
|
80
|
+
self.Y.value = 0
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class _NAND_(Component):
|
|
84
|
+
"""module _NAND_ (A, B, Y)"""
|
|
85
|
+
|
|
86
|
+
def __init__(self, circuit, name=None):
|
|
87
|
+
super().__init__(circuit, name)
|
|
88
|
+
self.add_port(PortIn(self, "A"))
|
|
89
|
+
self.add_port(PortIn(self, "B"))
|
|
90
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
91
|
+
|
|
92
|
+
def update(self):
|
|
93
|
+
if self.A.value == 1 and self.B.value == 1:
|
|
94
|
+
self.Y.value = 0
|
|
95
|
+
else:
|
|
96
|
+
self.Y.value = 1
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class _OR_(Component):
|
|
100
|
+
"""module _OR_ (A, B, Y)"""
|
|
101
|
+
|
|
102
|
+
def __init__(self, circuit, name=None):
|
|
103
|
+
super().__init__(circuit, name)
|
|
104
|
+
self.add_port(PortIn(self, "A"))
|
|
105
|
+
self.add_port(PortIn(self, "B"))
|
|
106
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
107
|
+
|
|
108
|
+
def update(self):
|
|
109
|
+
if self.A.value == 1 or self.B.value == 1:
|
|
110
|
+
self.Y.value = 1
|
|
111
|
+
else:
|
|
112
|
+
self.Y.value = 0
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class _NOR_(Component):
|
|
116
|
+
"""module _NOR_ (A, B, Y)"""
|
|
117
|
+
|
|
118
|
+
def __init__(self, circuit, name=None):
|
|
119
|
+
super().__init__(circuit, name)
|
|
120
|
+
self.add_port(PortIn(self, "A"))
|
|
121
|
+
self.add_port(PortIn(self, "B"))
|
|
122
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
123
|
+
|
|
124
|
+
def update(self):
|
|
125
|
+
if self.A.value == 1 or self.B.value == 1:
|
|
126
|
+
self.Y.value = 0
|
|
127
|
+
else:
|
|
128
|
+
self.Y.value = 1
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class _XOR_(Component):
|
|
132
|
+
"""module _XOR_ (A, B, Y)"""
|
|
133
|
+
|
|
134
|
+
def __init__(self, circuit, name=None):
|
|
135
|
+
super().__init__(circuit, name)
|
|
136
|
+
self.add_port(PortIn(self, "A"))
|
|
137
|
+
self.add_port(PortIn(self, "B"))
|
|
138
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
139
|
+
|
|
140
|
+
def update(self):
|
|
141
|
+
if (self.A.value == 1 and self.B.value == 0) or (self.A.value == 0 and self.B.value == 1):
|
|
142
|
+
self.Y.value = 1
|
|
143
|
+
else:
|
|
144
|
+
self.Y.value = 0
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class _XNOR_(Component):
|
|
148
|
+
"""module _XNOR_ (A, B, Y)"""
|
|
149
|
+
|
|
150
|
+
def __init__(self, circuit, name=None):
|
|
151
|
+
super().__init__(circuit, name)
|
|
152
|
+
self.add_port(PortIn(self, "A"))
|
|
153
|
+
self.add_port(PortIn(self, "B"))
|
|
154
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
155
|
+
|
|
156
|
+
def update(self):
|
|
157
|
+
if (self.A.value == 1 and self.B.value == 0) or (self.A.value == 0 and self.B.value == 1):
|
|
158
|
+
self.Y.value = 0
|
|
159
|
+
else:
|
|
160
|
+
self.Y.value = 1
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class _ANDNOT_(Component):
|
|
164
|
+
"""module _ANDNOT_ (A, B, Y)"""
|
|
165
|
+
|
|
166
|
+
def __init__(self, circuit, name=None):
|
|
167
|
+
super().__init__(circuit, name)
|
|
168
|
+
self.add_port(PortIn(self, "A"))
|
|
169
|
+
self.add_port(PortIn(self, "B"))
|
|
170
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
171
|
+
|
|
172
|
+
def update(self):
|
|
173
|
+
if self.A.value == 1 and self.B.value == 0:
|
|
174
|
+
self.Y.value = 1
|
|
175
|
+
else:
|
|
176
|
+
self.Y.value = 0
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class _ORNOT_(Component):
|
|
180
|
+
"""module _ORNOT_ (A, B, Y)"""
|
|
181
|
+
|
|
182
|
+
def __init__(self, circuit, name=None):
|
|
183
|
+
super().__init__(circuit, name)
|
|
184
|
+
self.add_port(PortIn(self, "A"))
|
|
185
|
+
self.add_port(PortIn(self, "B"))
|
|
186
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
187
|
+
|
|
188
|
+
def update(self):
|
|
189
|
+
if self.A.value == 1 or self.B.value == 0:
|
|
190
|
+
self.Y.value = 1
|
|
191
|
+
else:
|
|
192
|
+
self.Y.value = 0
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class _MUX_(Component):
|
|
196
|
+
"""module _MUX_ (A, B, S, Y)"""
|
|
197
|
+
|
|
198
|
+
def __init__(self, circuit, name=None):
|
|
199
|
+
super().__init__(circuit, name)
|
|
200
|
+
self.add_port(PortIn(self, "A"))
|
|
201
|
+
self.add_port(PortIn(self, "B"))
|
|
202
|
+
self.add_port(PortIn(self, "S"))
|
|
203
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
204
|
+
|
|
205
|
+
def update(self):
|
|
206
|
+
if self.S.value == 0:
|
|
207
|
+
self.Y.value = self.A.value
|
|
208
|
+
else:
|
|
209
|
+
self.Y.value = self.B.value
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class _NMUX_(Component):
|
|
213
|
+
"""module _NMUX_ (A, B, S, Y)"""
|
|
214
|
+
|
|
215
|
+
def __init__(self, circuit, name=None):
|
|
216
|
+
super().__init__(circuit, name)
|
|
217
|
+
self.add_port(PortIn(self, "A"))
|
|
218
|
+
self.add_port(PortIn(self, "B"))
|
|
219
|
+
self.add_port(PortIn(self, "S"))
|
|
220
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
221
|
+
|
|
222
|
+
def update(self):
|
|
223
|
+
if self.S.value == 0:
|
|
224
|
+
self.Y.value = 1 if self.A.value == 0 else 0
|
|
225
|
+
else:
|
|
226
|
+
self.Y.value = 1 if self.B.value == 0 else 0
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class _MUX4_(Component):
|
|
230
|
+
"""module _MUX4_ (A, B, C, D, S, T, Y)"""
|
|
231
|
+
|
|
232
|
+
def __init__(self, circuit, name=None):
|
|
233
|
+
super().__init__(circuit, name)
|
|
234
|
+
self.add_port(PortIn(self, "A"))
|
|
235
|
+
self.add_port(PortIn(self, "B"))
|
|
236
|
+
self.add_port(PortIn(self, "C"))
|
|
237
|
+
self.add_port(PortIn(self, "D"))
|
|
238
|
+
self.add_port(PortIn(self, "S"))
|
|
239
|
+
self.add_port(PortIn(self, "T"))
|
|
240
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
241
|
+
|
|
242
|
+
def update(self):
|
|
243
|
+
if self.S.value == 0 and self.T.value == 0:
|
|
244
|
+
self.Y.value = self.A.value
|
|
245
|
+
elif self.S.value == 1 and self.T.value == 0:
|
|
246
|
+
self.Y.value = self.B.value
|
|
247
|
+
elif self.S.value == 0 and self.T.value == 1:
|
|
248
|
+
self.Y.value = self.C.value
|
|
249
|
+
else:
|
|
250
|
+
self.Y.value = self.D.value
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
class _MUX8_(Component):
|
|
254
|
+
"""module _MUX8_ (A, B, C, D, E, F, G, H, S, T, U, Y)"""
|
|
255
|
+
|
|
256
|
+
def __init__(self, circuit, name=None):
|
|
257
|
+
super().__init__(circuit, name)
|
|
258
|
+
self.add_port(PortIn(self, "A"))
|
|
259
|
+
self.add_port(PortIn(self, "B"))
|
|
260
|
+
self.add_port(PortIn(self, "C"))
|
|
261
|
+
self.add_port(PortIn(self, "D"))
|
|
262
|
+
self.add_port(PortIn(self, "E"))
|
|
263
|
+
self.add_port(PortIn(self, "F"))
|
|
264
|
+
self.add_port(PortIn(self, "G"))
|
|
265
|
+
self.add_port(PortIn(self, "H"))
|
|
266
|
+
self.add_port(PortIn(self, "S"))
|
|
267
|
+
self.add_port(PortIn(self, "T"))
|
|
268
|
+
self.add_port(PortIn(self, "U"))
|
|
269
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
270
|
+
|
|
271
|
+
def update(self):
|
|
272
|
+
if self.S.value == 0 and self.T.value == 0 and self.U.value == 0:
|
|
273
|
+
self.Y.value = self.A.value
|
|
274
|
+
elif self.S.value == 1 and self.T.value == 0 and self.U.value == 0:
|
|
275
|
+
self.Y.value = self.B.value
|
|
276
|
+
elif self.S.value == 0 and self.T.value == 1 and self.U.value == 0:
|
|
277
|
+
self.Y.value = self.C.value
|
|
278
|
+
elif self.S.value == 1 and self.T.value == 1 and self.U.value == 0:
|
|
279
|
+
self.Y.value = self.D.value
|
|
280
|
+
elif self.S.value == 0 and self.T.value == 0 and self.U.value == 1:
|
|
281
|
+
self.Y.value = self.E.value
|
|
282
|
+
elif self.S.value == 1 and self.T.value == 0 and self.U.value == 1:
|
|
283
|
+
self.Y.value = self.F.value
|
|
284
|
+
elif self.S.value == 0 and self.T.value == 1 and self.U.value == 1:
|
|
285
|
+
self.Y.value = self.G.value
|
|
286
|
+
else:
|
|
287
|
+
self.Y.value = self.H.value
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class _MUX16_(Component):
|
|
291
|
+
"""module _MUX16_ (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V, Y)"""
|
|
292
|
+
|
|
293
|
+
def __init__(self, circuit, name=None):
|
|
294
|
+
super().__init__(circuit, name)
|
|
295
|
+
self.add_port(PortIn(self, "A"))
|
|
296
|
+
self.add_port(PortIn(self, "B"))
|
|
297
|
+
self.add_port(PortIn(self, "C"))
|
|
298
|
+
self.add_port(PortIn(self, "D"))
|
|
299
|
+
self.add_port(PortIn(self, "E"))
|
|
300
|
+
self.add_port(PortIn(self, "F"))
|
|
301
|
+
self.add_port(PortIn(self, "G"))
|
|
302
|
+
self.add_port(PortIn(self, "H"))
|
|
303
|
+
self.add_port(PortIn(self, "I"))
|
|
304
|
+
self.add_port(PortIn(self, "J"))
|
|
305
|
+
self.add_port(PortIn(self, "K"))
|
|
306
|
+
self.add_port(PortIn(self, "L"))
|
|
307
|
+
self.add_port(PortIn(self, "M"))
|
|
308
|
+
self.add_port(PortIn(self, "N"))
|
|
309
|
+
self.add_port(PortIn(self, "O"))
|
|
310
|
+
self.add_port(PortIn(self, "P"))
|
|
311
|
+
self.add_port(PortIn(self, "S"))
|
|
312
|
+
self.add_port(PortIn(self, "T"))
|
|
313
|
+
self.add_port(PortIn(self, "U"))
|
|
314
|
+
self.add_port(PortIn(self, "V"))
|
|
315
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
316
|
+
|
|
317
|
+
def update(self):
|
|
318
|
+
if self.S.value == 0 and self.T.value == 0 and self.U.value == 0 and self.V.value == 0:
|
|
319
|
+
self.Y.value = self.A.value
|
|
320
|
+
elif self.S.value == 1 and self.T.value == 0 and self.U.value == 0 and self.V.value == 0:
|
|
321
|
+
self.Y.value = self.B.value
|
|
322
|
+
elif self.S.value == 0 and self.T.value == 1 and self.U.value == 0 and self.V.value == 0:
|
|
323
|
+
self.Y.value = self.C.value
|
|
324
|
+
elif self.S.value == 1 and self.T.value == 1 and self.U.value == 0 and self.V.value == 0:
|
|
325
|
+
self.Y.value = self.D.value
|
|
326
|
+
elif self.S.value == 0 and self.T.value == 0 and self.U.value == 1 and self.V.value == 0:
|
|
327
|
+
self.Y.value = self.E.value
|
|
328
|
+
elif self.S.value == 1 and self.T.value == 0 and self.U.value == 1 and self.V.value == 0:
|
|
329
|
+
self.Y.value = self.F.value
|
|
330
|
+
elif self.S.value == 0 and self.T.value == 1 and self.U.value == 1 and self.V.value == 0:
|
|
331
|
+
self.Y.value = self.G.value
|
|
332
|
+
elif self.S.value == 1 and self.T.value == 1 and self.U.value == 1 and self.V.value == 0:
|
|
333
|
+
self.Y.value = self.H.value
|
|
334
|
+
elif self.S.value == 0 and self.T.value == 0 and self.U.value == 0 and self.V.value == 1:
|
|
335
|
+
self.Y.value = self.I.value
|
|
336
|
+
elif self.S.value == 1 and self.T.value == 0 and self.U.value == 0 and self.V.value == 1:
|
|
337
|
+
self.Y.value = self.J.value
|
|
338
|
+
elif self.S.value == 0 and self.T.value == 1 and self.U.value == 0 and self.V.value == 1:
|
|
339
|
+
self.Y.value = self.K.value
|
|
340
|
+
elif self.S.value == 1 and self.T.value == 1 and self.U.value == 0 and self.V.value == 1:
|
|
341
|
+
self.Y.value = self.L.value
|
|
342
|
+
elif self.S.value == 0 and self.T.value == 0 and self.U.value == 1 and self.V.value == 1:
|
|
343
|
+
self.Y.value = self.M.value
|
|
344
|
+
elif self.S.value == 1 and self.T.value == 0 and self.U.value == 1 and self.V.value == 1:
|
|
345
|
+
self.Y.value = self.N.value
|
|
346
|
+
elif self.S.value == 0 and self.T.value == 1 and self.U.value == 1 and self.V.value == 1:
|
|
347
|
+
self.Y.value = self.O.value
|
|
348
|
+
else:
|
|
349
|
+
self.Y.value = self.P.value
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
class _AOI3_(Component):
|
|
353
|
+
"""module _AOI3_ (A, B, C, Y)"""
|
|
354
|
+
|
|
355
|
+
def __init__(self, circuit, name=None):
|
|
356
|
+
super().__init__(circuit, name)
|
|
357
|
+
self.add_port(PortIn(self, "A"))
|
|
358
|
+
self.add_port(PortIn(self, "B"))
|
|
359
|
+
self.add_port(PortIn(self, "C"))
|
|
360
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
361
|
+
|
|
362
|
+
def update(self):
|
|
363
|
+
if (self.A.value == 1 and self.B.value == 1) or self.C.value == 1:
|
|
364
|
+
self.Y.value = 0
|
|
365
|
+
else:
|
|
366
|
+
self.Y.value = 1
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
class _OAI3_(Component):
|
|
370
|
+
"""module _OAI3_ (A, B, C, Y)"""
|
|
371
|
+
|
|
372
|
+
def __init__(self, circuit, name=None):
|
|
373
|
+
super().__init__(circuit, name)
|
|
374
|
+
self.add_port(PortIn(self, "A"))
|
|
375
|
+
self.add_port(PortIn(self, "B"))
|
|
376
|
+
self.add_port(PortIn(self, "C"))
|
|
377
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
378
|
+
|
|
379
|
+
def update(self):
|
|
380
|
+
if (self.A.value == 1 or self.B.value == 1) and self.C.value == 1:
|
|
381
|
+
self.Y.value = 0
|
|
382
|
+
else:
|
|
383
|
+
self.Y.value = 1
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
class _AOI4_(Component):
|
|
387
|
+
"""module _AOI4_ (A, B, C, D, Y)"""
|
|
388
|
+
|
|
389
|
+
def __init__(self, circuit, name=None):
|
|
390
|
+
super().__init__(circuit, name)
|
|
391
|
+
self.add_port(PortIn(self, "A"))
|
|
392
|
+
self.add_port(PortIn(self, "B"))
|
|
393
|
+
self.add_port(PortIn(self, "C"))
|
|
394
|
+
self.add_port(PortIn(self, "D"))
|
|
395
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
396
|
+
|
|
397
|
+
def update(self):
|
|
398
|
+
if (self.A.value == 1 and self.B.value == 1) or (self.C.value == 1 and self.D.value == 1):
|
|
399
|
+
self.Y.value = 0
|
|
400
|
+
else:
|
|
401
|
+
self.Y.value = 1
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
class _OAI4_(Component):
|
|
405
|
+
"""module _OAI4_ (A, B, C, D, Y)"""
|
|
406
|
+
|
|
407
|
+
def __init__(self, circuit, name=None):
|
|
408
|
+
super().__init__(circuit, name)
|
|
409
|
+
self.add_port(PortIn(self, "A"))
|
|
410
|
+
self.add_port(PortIn(self, "B"))
|
|
411
|
+
self.add_port(PortIn(self, "C"))
|
|
412
|
+
self.add_port(PortIn(self, "D"))
|
|
413
|
+
self.add_port(PortOutDelta(self, "Y"))
|
|
414
|
+
|
|
415
|
+
def update(self):
|
|
416
|
+
if (self.A.value == 1 or self.B.value == 1) and (self.C.value == 1 or self.D.value == 1):
|
|
417
|
+
self.Y.value = 0
|
|
418
|
+
else:
|
|
419
|
+
self.Y.value = 1
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
class _TBUF_(Component):
|
|
423
|
+
"""module _TBUF_ (A, E, Y)"""
|
|
424
|
+
|
|
425
|
+
def __init__(self, circuit, name=None):
|
|
426
|
+
super().__init__(circuit, name)
|
|
427
|
+
raise YosysNotImplementedException("NOT IMPLEMENTED: Tri-state buffer")
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
class _SR_(ClassNameParameterComponent):
|
|
431
|
+
"""Set-reset latch"""
|
|
432
|
+
|
|
433
|
+
def __init__(self, circuit, name=None):
|
|
434
|
+
super().__init__(circuit, name)
|
|
435
|
+
self._set_level = self.name_to_level(0)
|
|
436
|
+
self._reset_level = self.name_to_level(1)
|
|
437
|
+
self.add_port(PortIn(self, "S"))
|
|
438
|
+
self.add_port(PortIn(self, "R"))
|
|
439
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
440
|
+
|
|
441
|
+
def default_state(self):
|
|
442
|
+
self.Q.value = 0
|
|
443
|
+
|
|
444
|
+
def update(self):
|
|
445
|
+
if self.R.value == self._reset_level:
|
|
446
|
+
self.Q.value = 0
|
|
447
|
+
elif self.S.value == self._set_level:
|
|
448
|
+
self.Q.value = 1
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
class _SR_NN_(_SR_):
|
|
452
|
+
"""module _SR_NN_ (S, R, Q)"""
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
class _SR_NP_(_SR_):
|
|
456
|
+
"""module _SR_NP_ (S, R, Q)"""
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
class _SR_PN_(_SR_):
|
|
460
|
+
"""module _SR_PN_ (S, R, Q)"""
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
class _SR_PP_(_SR_):
|
|
464
|
+
"""module _SR_PP_ (S, R, Q)"""
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
class _FF_(Component):
|
|
468
|
+
"""module module _FF_ (D, Q)"""
|
|
469
|
+
|
|
470
|
+
def __init__(self, circuit, name=None):
|
|
471
|
+
super().__init__(circuit, name)
|
|
472
|
+
raise YosysNotImplementedException(
|
|
473
|
+
"NOT IMPLEMENTED: D-type flip-flop that is clocked from the implicit global clock"
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
class _DFF_(ClassNameParameterComponent):
|
|
478
|
+
"""D-type flip-flop"""
|
|
479
|
+
|
|
480
|
+
def __init__(self, circuit, name=None):
|
|
481
|
+
super().__init__(circuit, name)
|
|
482
|
+
self._clock_edge = self.name_to_level(0)
|
|
483
|
+
self.add_port(PortIn(self, "C"))
|
|
484
|
+
self.add_port(PortWire(self, "D"))
|
|
485
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
486
|
+
self._old_C_level = self.C.value
|
|
487
|
+
|
|
488
|
+
def default_state(self):
|
|
489
|
+
self.Q.value = 0
|
|
490
|
+
|
|
491
|
+
def update(self):
|
|
492
|
+
if self.C.value != self._old_C_level and self.C.value == self._clock_edge:
|
|
493
|
+
self.Q.value = self.D.value
|
|
494
|
+
self._old_C_level = self.C.value
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
class _DFF_N_(_DFF_):
|
|
498
|
+
"""module _DFF_N_ (D, C, Q)"""
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
class _DFF_P_(_DFF_):
|
|
502
|
+
"""module _DFF_P_ (D, C, Q)"""
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
class _DFFE2_(ClassNameParameterComponent):
|
|
506
|
+
"""D-type flip-flop with clock enable"""
|
|
507
|
+
|
|
508
|
+
def __init__(self, circuit, name=None):
|
|
509
|
+
super().__init__(circuit, name)
|
|
510
|
+
self._clock_edge = self.name_to_level(0)
|
|
511
|
+
self._enable_level = self.name_to_level(1)
|
|
512
|
+
self.add_port(PortIn(self, "C"))
|
|
513
|
+
self.add_port(PortWire(self, "D"))
|
|
514
|
+
self.add_port(PortWire(self, "E"))
|
|
515
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
516
|
+
self._old_C_level = self.C.value
|
|
517
|
+
|
|
518
|
+
def default_state(self):
|
|
519
|
+
self.Q.value = 0
|
|
520
|
+
|
|
521
|
+
def update(self):
|
|
522
|
+
if (
|
|
523
|
+
self.C.value != self._old_C_level
|
|
524
|
+
and self.C.value == self._clock_edge
|
|
525
|
+
and self.E.value == self._enable_level
|
|
526
|
+
):
|
|
527
|
+
self.Q.value = self.D.value
|
|
528
|
+
self._old_C_level = self.C.value
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
class _DFFE_NN_(_DFFE2_):
|
|
532
|
+
"""module _DFFE_NN_ (D, C, E, Q)"""
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
class _DFFE_NP_(_DFFE2_):
|
|
536
|
+
"""module _DFFE_NP_ (D, C, E, Q)"""
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
class _DFFE_PN_(_DFFE2_):
|
|
540
|
+
"""module _DFFE_PN_ (D, C, E, Q)"""
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
class _DFFE_PP_(_DFFE2_):
|
|
544
|
+
"""module _DFFE_PP_ (D, C, E, Q)"""
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
class _DFF3_(ClassNameParameterComponent):
|
|
548
|
+
"""D-type flip-flop with reset"""
|
|
549
|
+
|
|
550
|
+
def __init__(self, circuit, name=None):
|
|
551
|
+
super().__init__(circuit, name)
|
|
552
|
+
self._clock_edge = self.name_to_level(0)
|
|
553
|
+
self._reset_level = self.name_to_level(1)
|
|
554
|
+
self._reset_value = self.name_to_level(2)
|
|
555
|
+
self.add_port(PortIn(self, "C"))
|
|
556
|
+
self.add_port(PortIn(self, "R"))
|
|
557
|
+
self.add_port(PortWire(self, "D"))
|
|
558
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
559
|
+
self._old_C_level = self.C.value
|
|
560
|
+
|
|
561
|
+
def default_state(self):
|
|
562
|
+
self.Q.value = 0
|
|
563
|
+
|
|
564
|
+
def update(self):
|
|
565
|
+
if self.R.value == self._reset_level:
|
|
566
|
+
self.Q.value = self._reset_value
|
|
567
|
+
elif self.C.value != self._old_C_level and self.C.value == self._clock_edge:
|
|
568
|
+
self.Q.value = self.D.value
|
|
569
|
+
self._old_C_level = self.C.value
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
class _DFF_NN0_(_DFF3_):
|
|
573
|
+
"""module _DFF_NN0_ (D, C, R, Q)"""
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
class _DFF_NN1_(_DFF3_):
|
|
577
|
+
"""module _DFF_NN1_ (D, C, R, Q)"""
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
class _DFF_NP0_(_DFF3_):
|
|
581
|
+
"""module _DFF_NP0_ (D, C, R, Q)"""
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
class _DFF_NP1_(_DFF3_):
|
|
585
|
+
"""module _DFF_NP1_ (D, C, R, Q)"""
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
class _DFF_PN0_(_DFF3_):
|
|
589
|
+
"""module _DFF_PN0_ (D, C, R, Q)"""
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
class _DFF_PN1_(_DFF3_):
|
|
593
|
+
"""module _DFF_PN1_ (D, C, R, Q)"""
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
class _DFF_PP0_(_DFF3_):
|
|
597
|
+
"""module _DFF_PP0_ (D, C, R, Q)"""
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
class _DFF_PP1_(_DFF3_):
|
|
601
|
+
"""module _DFF_PP1_ (D, C, R, Q)"""
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
class _DFFE4_(ClassNameParameterComponent):
|
|
605
|
+
"""D-type flip-flop with reset and clock enable"""
|
|
606
|
+
|
|
607
|
+
def __init__(self, circuit, name=None):
|
|
608
|
+
super().__init__(circuit, name)
|
|
609
|
+
self._clock_edge = self.name_to_level(0)
|
|
610
|
+
self._reset_level = self.name_to_level(1)
|
|
611
|
+
self._reset_value = self.name_to_level(2)
|
|
612
|
+
self._enable_level = self.name_to_level(3)
|
|
613
|
+
self.add_port(PortIn(self, "C"))
|
|
614
|
+
self.add_port(PortWire(self, "D"))
|
|
615
|
+
self.add_port(PortWire(self, "E"))
|
|
616
|
+
self.add_port(PortIn(self, "R"))
|
|
617
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
618
|
+
self._old_C_level = self.C.value
|
|
619
|
+
|
|
620
|
+
def default_state(self):
|
|
621
|
+
self.Q.value = 0
|
|
622
|
+
|
|
623
|
+
def update(self):
|
|
624
|
+
if self.R.value == self._reset_level:
|
|
625
|
+
self.Q.value = self._reset_value
|
|
626
|
+
elif (
|
|
627
|
+
self.C.value != self._old_C_level
|
|
628
|
+
and self.C.value == self._clock_edge
|
|
629
|
+
and self.E.value == self._enable_level
|
|
630
|
+
):
|
|
631
|
+
self.Q.value = self.D.value
|
|
632
|
+
self._old_C_level = self.C.value
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
class _DFFE_NN0N_(_DFFE4_):
|
|
636
|
+
"""module _DFFE_NN0N_ (D, C, R, E, Q)"""
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
class _DFFE_NN0P_(_DFFE4_):
|
|
640
|
+
"""module _DFFE_NN0P_ (D, C, R, E, Q)"""
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
class _DFFE_NN1N_(_DFFE4_):
|
|
644
|
+
"""module _DFFE_NN1N_ (D, C, R, E, Q)"""
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
class _DFFE_NN1P_(_DFFE4_):
|
|
648
|
+
"""module _DFFE_NN1P_ (D, C, R, E, Q)"""
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
class _DFFE_NP0N_(_DFFE4_):
|
|
652
|
+
"""module _DFFE_NP0N_ (D, C, R, E, Q)"""
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
class _DFFE_NP0P_(_DFFE4_):
|
|
656
|
+
"""module _DFFE_NP0P_ (D, C, R, E, Q)"""
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
class _DFFE_NP1N_(_DFFE4_):
|
|
660
|
+
"""module _DFFE_NP1N_ (D, C, R, E, Q)"""
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
class _DFFE_NP1P_(_DFFE4_):
|
|
664
|
+
"""module _DFFE_NP1P_ (D, C, R, E, Q)"""
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
class _DFFE_PN0N_(_DFFE4_):
|
|
668
|
+
"""module _DFFE_PN0N_ (D, C, R, E, Q)"""
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
class _DFFE_PN0P_(_DFFE4_):
|
|
672
|
+
"""module _DFFE_PN0P_ (D, C, R, E, Q)"""
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
class _DFFE_PN1N_(_DFFE4_):
|
|
676
|
+
"""module _DFFE_PN1N_ (D, C, R, E, Q)"""
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
class _DFFE_PN1P_(_DFFE4_):
|
|
680
|
+
"""module _DFFE_PN1P_ (D, C, R, E, Q)"""
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
class _DFFE_PP0N_(_DFFE4_):
|
|
684
|
+
"""module _DFFE_PP0N_ (D, C, R, E, Q)"""
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
class _DFFE_PP0P_(_DFFE4_):
|
|
688
|
+
"""module _DFFE_PP0P_ (D, C, R, E, Q)"""
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
class _DFFE_PP1N_(_DFFE4_):
|
|
692
|
+
"""module _DFFE_PP1N_ (D, C, R, E, Q)"""
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
class _DFFE_PP1P_(_DFFE4_):
|
|
696
|
+
"""module _DFFE_PP1P_ (D, C, R, E, Q)"""
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
class _ALDFF_(ClassNameParameterComponent):
|
|
700
|
+
"""D-type flip-flop with async load"""
|
|
701
|
+
|
|
702
|
+
def __init__(self, circuit, name=None):
|
|
703
|
+
super().__init__(circuit, name)
|
|
704
|
+
self._clock_edge = self.name_to_level(0)
|
|
705
|
+
self._load_level = self.name_to_level(1)
|
|
706
|
+
self.add_port(PortWire(self, "AD"))
|
|
707
|
+
self.add_port(PortIn(self, "C"))
|
|
708
|
+
self.add_port(PortWire(self, "D"))
|
|
709
|
+
self.add_port(PortIn(self, "L"))
|
|
710
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
711
|
+
self._old_C_level = self.C.value
|
|
712
|
+
|
|
713
|
+
def default_state(self):
|
|
714
|
+
self.Q.value = 0
|
|
715
|
+
|
|
716
|
+
def update(self):
|
|
717
|
+
if self.L.value == self._load_level:
|
|
718
|
+
self.Q.value = self.AD.value
|
|
719
|
+
elif self.C.value != self._old_C_level and self.C.value == self._clock_edge:
|
|
720
|
+
self.Q.value = self.D.value
|
|
721
|
+
self._old_C_level = self.C.value
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
class _ALDFF_NN_(_ALDFF_):
|
|
725
|
+
"""module _ALDFF_NN_ (D, C, L, AD, Q)"""
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
class _ALDFF_NP_(_ALDFF_):
|
|
729
|
+
"""module _ALDFF_NP_ (D, C, L, AD, Q)"""
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
class _ALDFF_PN_(_ALDFF_):
|
|
733
|
+
"""module _ALDFF_PN_ (D, C, L, AD, Q)"""
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
class _ALDFF_PP_(_ALDFF_):
|
|
737
|
+
"""module _ALDFF_PP_ (D, C, L, AD, Q)"""
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
class _ALDFFE_(ClassNameParameterComponent):
|
|
741
|
+
"""D-type flip-flop with async load and clock enable"""
|
|
742
|
+
|
|
743
|
+
def __init__(self, circuit, name=None):
|
|
744
|
+
super().__init__(circuit, name)
|
|
745
|
+
self._clock_edge = self.name_to_level(0)
|
|
746
|
+
self._load_level = self.name_to_level(1)
|
|
747
|
+
self._enable_level = self.name_to_level(2)
|
|
748
|
+
self.add_port(PortWire(self, "AD"))
|
|
749
|
+
self.add_port(PortIn(self, "C"))
|
|
750
|
+
self.add_port(PortWire(self, "D"))
|
|
751
|
+
self.add_port(PortWire(self, "E"))
|
|
752
|
+
self.add_port(PortIn(self, "L"))
|
|
753
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
754
|
+
self._old_C_level = self.C.value
|
|
755
|
+
|
|
756
|
+
def default_state(self):
|
|
757
|
+
self.Q.value = self._reset_level
|
|
758
|
+
|
|
759
|
+
def update(self):
|
|
760
|
+
if self.L.value == self._load_level:
|
|
761
|
+
self.Q.value = self.AD.value
|
|
762
|
+
elif (
|
|
763
|
+
self.C.value != self._old_C_level
|
|
764
|
+
and self.C.value == self._clock_edge
|
|
765
|
+
and self.E.value == self._enable_level
|
|
766
|
+
):
|
|
767
|
+
self.Q.value = self.D.value
|
|
768
|
+
self._old_C_level = self.C.value
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
class _ALDFFE_NNN_(_ALDFFE_):
|
|
772
|
+
"""module _ALDFFE_NNN_ (D, C, L, AD, E, Q)"""
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
class _ALDFFE_NNP_(_ALDFFE_):
|
|
776
|
+
"""module _ALDFFE_NNP_ (D, C, L, AD, E, Q)"""
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
class _ALDFFE_NPN_(_ALDFFE_):
|
|
780
|
+
"""module _ALDFFE_NPN_ (D, C, L, AD, E, Q)"""
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
class _ALDFFE_NPP_(_ALDFFE_):
|
|
784
|
+
"""module _ALDFFE_NPP_ (D, C, L, AD, E, Q)"""
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
class _ALDFFE_PNN_(_ALDFFE_):
|
|
788
|
+
"""module _ALDFFE_PNN_ (D, C, L, AD, E, Q)"""
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
class _ALDFFE_PNP_(_ALDFFE_):
|
|
792
|
+
"""module _ALDFFE_PNP_ (D, C, L, AD, E, Q)"""
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
class _ALDFFE_PPN_(_ALDFFE_):
|
|
796
|
+
"""module _ALDFFE_PPN_ (D, C, L, AD, E, Q)"""
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
class _ALDFFE_PPP_(_ALDFFE_):
|
|
800
|
+
"""module _ALDFFE_PPP_ (D, C, L, AD, E, Q)"""
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
class _DFFSR_(ClassNameParameterComponent):
|
|
804
|
+
"""D-type flip-flop with with set and reset"""
|
|
805
|
+
|
|
806
|
+
def __init__(self, circuit, name=None):
|
|
807
|
+
super().__init__(circuit, name)
|
|
808
|
+
self._clock_edge = self.name_to_level(0)
|
|
809
|
+
self._set_level = self.name_to_level(1)
|
|
810
|
+
self._reset_level = self.name_to_level(2)
|
|
811
|
+
self.add_port(PortIn(self, "C"))
|
|
812
|
+
self.add_port(PortIn(self, "R"))
|
|
813
|
+
self.add_port(PortIn(self, "S"))
|
|
814
|
+
self.add_port(PortWire(self, "D"))
|
|
815
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
816
|
+
self._old_C_level = self.C.value
|
|
817
|
+
|
|
818
|
+
def default_state(self):
|
|
819
|
+
self.Q.value = 0
|
|
820
|
+
|
|
821
|
+
def update(self):
|
|
822
|
+
if self.R.value == self._reset_level:
|
|
823
|
+
self.Q.value = 0
|
|
824
|
+
elif self.S.value == self._set_level:
|
|
825
|
+
self.Q.value = 1
|
|
826
|
+
elif self.C.value != self._old_C_level and self.C.value == self._clock_edge:
|
|
827
|
+
self.Q.value = self.D.value
|
|
828
|
+
self._old_C_level = self.C.value
|
|
829
|
+
|
|
830
|
+
|
|
831
|
+
class _DFFSR_NNN_(_DFFSR_):
|
|
832
|
+
"""module _DFFSR_NNN_ (C, S, R, D, Q)"""
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
class _DFFSR_NNP_(_DFFSR_):
|
|
836
|
+
"""module _DFFSR_NNP_ (C, S, R, D, Q)"""
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
class _DFFSR_NPN_(_DFFSR_):
|
|
840
|
+
"""module _DFFSR_NPN_ (C, S, R, D, Q)"""
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
class _DFFSR_NPP_(_DFFSR_):
|
|
844
|
+
"""module _DFFSR_NPP_ (C, S, R, D, Q)"""
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
class _DFFSR_PNN_(_DFFSR_):
|
|
848
|
+
"""module _DFFSR_PNN_ (C, S, R, D, Q)"""
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
class _DFFSR_PNP_(_DFFSR_):
|
|
852
|
+
"""module _DFFSR_PNP_ (C, S, R, D, Q)"""
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
class _DFFSR_PPN_(_DFFSR_):
|
|
856
|
+
"""module _DFFSR_PPN_ (C, S, R, D, Q)"""
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
class _DFFSR_PPP_(_DFFSR_):
|
|
860
|
+
"""module _DFFSR_PPP_ (C, S, R, D, Q)"""
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
class _DFFSRE_(ClassNameParameterComponent):
|
|
864
|
+
"""D-type flip-flop with with set, reset and clock enable"""
|
|
865
|
+
|
|
866
|
+
def __init__(self, circuit, name=None):
|
|
867
|
+
super().__init__(circuit, name)
|
|
868
|
+
self._clock_edge = self.name_to_level(0)
|
|
869
|
+
self._set_level = self.name_to_level(1)
|
|
870
|
+
self._reset_level = self.name_to_level(2)
|
|
871
|
+
self._enable_level = self.name_to_level(3)
|
|
872
|
+
self.add_port(PortIn(self, "C"))
|
|
873
|
+
self.add_port(PortIn(self, "R"))
|
|
874
|
+
self.add_port(PortIn(self, "S"))
|
|
875
|
+
self.add_port(PortWire(self, "E"))
|
|
876
|
+
self.add_port(PortWire(self, "D"))
|
|
877
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
878
|
+
self._old_C_level = self.C.value
|
|
879
|
+
|
|
880
|
+
def default_state(self):
|
|
881
|
+
self.Q.value = 0
|
|
882
|
+
|
|
883
|
+
def update(self):
|
|
884
|
+
if self.R.value == self._reset_level:
|
|
885
|
+
self.Q.value = 0
|
|
886
|
+
elif self.S.value == self._set_level:
|
|
887
|
+
self.Q.value = 1
|
|
888
|
+
elif (
|
|
889
|
+
self.C.value != self._old_C_level
|
|
890
|
+
and self.C.value == self._clock_edge
|
|
891
|
+
and self.E.value == self._enable_level
|
|
892
|
+
):
|
|
893
|
+
self.Q.value = self.D.value
|
|
894
|
+
self._old_C_level = self.C.value
|
|
895
|
+
|
|
896
|
+
|
|
897
|
+
class _DFFSRE_NNNN_(_DFFSRE_):
|
|
898
|
+
"""module _DFFSRE_NNNN_ (C, S, R, E, D, Q)"""
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
class _DFFSRE_NNNP_(_DFFSRE_):
|
|
902
|
+
"""module _DFFSRE_NNNP_ (C, S, R, E, D, Q)"""
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
class _DFFSRE_NNPN_(_DFFSRE_):
|
|
906
|
+
"""module _DFFSRE_NNPN_ (C, S, R, E, D, Q)"""
|
|
907
|
+
|
|
908
|
+
|
|
909
|
+
class _DFFSRE_NNPP_(_DFFSRE_):
|
|
910
|
+
"""module _DFFSRE_NNPP_ (C, S, R, E, D, Q)"""
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
class _DFFSRE_NPNN_(_DFFSRE_):
|
|
914
|
+
"""module _DFFSRE_NPNN_ (C, S, R, E, D, Q)"""
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
class _DFFSRE_NPNP_(_DFFSRE_):
|
|
918
|
+
"""module _DFFSRE_NPNP_ (C, S, R, E, D, Q)"""
|
|
919
|
+
|
|
920
|
+
|
|
921
|
+
class _DFFSRE_NPPN_(_DFFSRE_):
|
|
922
|
+
"""module _DFFSRE_NPPN_ (C, S, R, E, D, Q)"""
|
|
923
|
+
|
|
924
|
+
|
|
925
|
+
class _DFFSRE_NPPP_(_DFFSRE_):
|
|
926
|
+
"""module _DFFSRE_NPPP_ (C, S, R, E, D, Q)"""
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
class _DFFSRE_PNNN_(_DFFSRE_):
|
|
930
|
+
"""module _DFFSRE_PNNN_ (C, S, R, E, D, Q)"""
|
|
931
|
+
|
|
932
|
+
|
|
933
|
+
class _DFFSRE_PNNP_(_DFFSRE_):
|
|
934
|
+
"""module _DFFSRE_PNNP_ (C, S, R, E, D, Q)"""
|
|
935
|
+
|
|
936
|
+
|
|
937
|
+
class _DFFSRE_PNPN_(_DFFSRE_):
|
|
938
|
+
"""module _DFFSRE_PNPN_ (C, S, R, E, D, Q)"""
|
|
939
|
+
|
|
940
|
+
|
|
941
|
+
class _DFFSRE_PNPP_(_DFFSRE_):
|
|
942
|
+
"""module _DFFSRE_PNPP_ (C, S, R, E, D, Q)"""
|
|
943
|
+
|
|
944
|
+
|
|
945
|
+
class _DFFSRE_PPNN_(_DFFSRE_):
|
|
946
|
+
"""module _DFFSRE_PPNN_ (C, S, R, E, D, Q)"""
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
class _DFFSRE_PPNP_(_DFFSRE_):
|
|
950
|
+
"""module _DFFSRE_PPNP_ (C, S, R, E, D, Q)"""
|
|
951
|
+
|
|
952
|
+
|
|
953
|
+
class _DFFSRE_PPPN_(_DFFSRE_):
|
|
954
|
+
"""module _DFFSRE_PPPN_ (C, S, R, E, D, Q)"""
|
|
955
|
+
|
|
956
|
+
|
|
957
|
+
class _DFFSRE_PPPP_(_DFFSRE_):
|
|
958
|
+
"""module _DFFSRE_PPPP_ (C, S, R, E, D, Q)"""
|
|
959
|
+
|
|
960
|
+
|
|
961
|
+
class _SDFF_(ClassNameParameterComponent):
|
|
962
|
+
"""D-type flip-flop with sync reset"""
|
|
963
|
+
|
|
964
|
+
def __init__(self, circuit, name=None):
|
|
965
|
+
super().__init__(circuit, name)
|
|
966
|
+
self._clock_edge = self.name_to_level(0)
|
|
967
|
+
self._reset_level = self.name_to_level(1)
|
|
968
|
+
self._reset_value = self.name_to_level(2)
|
|
969
|
+
self.add_port(PortIn(self, "C"))
|
|
970
|
+
self.add_port(PortWire(self, "R"))
|
|
971
|
+
self.add_port(PortWire(self, "D"))
|
|
972
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
973
|
+
self._old_C_level = self.C.value
|
|
974
|
+
|
|
975
|
+
def default_state(self):
|
|
976
|
+
self.Q.value = 0
|
|
977
|
+
|
|
978
|
+
def update(self):
|
|
979
|
+
if self.C.value != self._old_C_level and self.C.value == self._clock_edge:
|
|
980
|
+
if self.R.value == self._reset_level:
|
|
981
|
+
self.Q.value = self._reset_value
|
|
982
|
+
else:
|
|
983
|
+
self.Q.value = self.D.value
|
|
984
|
+
self._old_C_level = self.C.value
|
|
985
|
+
|
|
986
|
+
|
|
987
|
+
class _SDFF_NN0_(_SDFF_):
|
|
988
|
+
"""module _SDFF_NN0_ (D, C, R, Q)"""
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
class _SDFF_NN1_(_SDFF_):
|
|
992
|
+
"""module _SDFF_NN1_ (D, C, R, Q)"""
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
class _SDFF_NP0_(_SDFF_):
|
|
996
|
+
"""module _SDFF_NP0_ (D, C, R, Q)"""
|
|
997
|
+
|
|
998
|
+
|
|
999
|
+
class _SDFF_NP1_(_SDFF_):
|
|
1000
|
+
"""module _SDFF_NP1_ (D, C, R, Q)"""
|
|
1001
|
+
|
|
1002
|
+
|
|
1003
|
+
class _SDFF_PN0_(_SDFF_):
|
|
1004
|
+
"""module _SDFF_PN0_ (D, C, R, Q)"""
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
class _SDFF_PN1_(_SDFF_):
|
|
1008
|
+
"""module _SDFF_PN1_ (D, C, R, Q)"""
|
|
1009
|
+
|
|
1010
|
+
|
|
1011
|
+
class _SDFF_PP0_(_SDFF_):
|
|
1012
|
+
"""module _SDFF_PP0_ (D, C, R, Q)"""
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
class _SDFF_PP1_(_SDFF_):
|
|
1016
|
+
"""module _SDFF_PP1_ (D, C, R, Q)"""
|
|
1017
|
+
|
|
1018
|
+
|
|
1019
|
+
class _SDFFE_(ClassNameParameterComponent):
|
|
1020
|
+
"""D-type flip-flop with sync reset and clock enable (with reset having priority)"""
|
|
1021
|
+
|
|
1022
|
+
def __init__(self, circuit, name=None):
|
|
1023
|
+
super().__init__(circuit, name)
|
|
1024
|
+
self._clock_edge = self.name_to_level(0)
|
|
1025
|
+
self._reset_level = self.name_to_level(1)
|
|
1026
|
+
self._reset_value = self.name_to_level(2)
|
|
1027
|
+
self._enable_level = self.name_to_level(3)
|
|
1028
|
+
self.add_port(PortIn(self, "C"))
|
|
1029
|
+
self.add_port(PortWire(self, "D"))
|
|
1030
|
+
self.add_port(PortWire(self, "E"))
|
|
1031
|
+
self.add_port(PortWire(self, "R"))
|
|
1032
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
1033
|
+
self._old_C_level = self.C.value
|
|
1034
|
+
|
|
1035
|
+
def default_state(self):
|
|
1036
|
+
self.Q.value = 0
|
|
1037
|
+
|
|
1038
|
+
def update(self):
|
|
1039
|
+
if self.C.value != self._old_C_level and self.C.value == self._clock_edge:
|
|
1040
|
+
if self.R.value == self._reset_level:
|
|
1041
|
+
self.Q.value = self._reset_value
|
|
1042
|
+
elif self.E.value == self._enable_level:
|
|
1043
|
+
self.Q.value = self.D.value
|
|
1044
|
+
self._old_C_level = self.C.value
|
|
1045
|
+
|
|
1046
|
+
|
|
1047
|
+
class _SDFFE_NN0N_(_SDFFE_):
|
|
1048
|
+
"""module _SDFFE_NN0N_ (D, C, R, E, Q)"""
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
class _SDFFE_NN0P_(_SDFFE_):
|
|
1052
|
+
"""module _SDFFE_NN0P_ (D, C, R, E, Q)"""
|
|
1053
|
+
|
|
1054
|
+
|
|
1055
|
+
class _SDFFE_NN1N_(_SDFFE_):
|
|
1056
|
+
"""module _SDFFE_NN1N_ (D, C, R, E, Q)"""
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
class _SDFFE_NN1P_(_SDFFE_):
|
|
1060
|
+
"""module _SDFFE_NN1P_ (D, C, R, E, Q)"""
|
|
1061
|
+
|
|
1062
|
+
|
|
1063
|
+
class _SDFFE_NP0N_(_SDFFE_):
|
|
1064
|
+
"""module _SDFFE_NP0N_ (D, C, R, E, Q)"""
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
class _SDFFE_NP0P_(_SDFFE_):
|
|
1068
|
+
"""module _SDFFE_NP0P_ (D, C, R, E, Q)"""
|
|
1069
|
+
|
|
1070
|
+
|
|
1071
|
+
class _SDFFE_NP1N_(_SDFFE_):
|
|
1072
|
+
"""module _SDFFE_NP1N_ (D, C, R, E, Q)"""
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
class _SDFFE_NP1P_(_SDFFE_):
|
|
1076
|
+
"""module _SDFFE_NP1P_ (D, C, R, E, Q)"""
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
class _SDFFE_PN0N_(_SDFFE_):
|
|
1080
|
+
"""module _SDFFE_PN0N_ (D, C, R, E, Q)"""
|
|
1081
|
+
|
|
1082
|
+
|
|
1083
|
+
class _SDFFE_PN0P_(_SDFFE_):
|
|
1084
|
+
"""module _SDFFE_PN0P_ (D, C, R, E, Q)"""
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
class _SDFFE_PN1N_(_SDFFE_):
|
|
1088
|
+
"""module _SDFFE_PN1N_ (D, C, R, E, Q)"""
|
|
1089
|
+
|
|
1090
|
+
|
|
1091
|
+
class _SDFFE_PN1P_(_SDFFE_):
|
|
1092
|
+
"""module _SDFFE_PN1P_ (D, C, R, E, Q)"""
|
|
1093
|
+
|
|
1094
|
+
|
|
1095
|
+
class _SDFFE_PP0N_(_SDFFE_):
|
|
1096
|
+
"""module _SDFFE_PP0N_ (D, C, R, E, Q)"""
|
|
1097
|
+
|
|
1098
|
+
|
|
1099
|
+
class _SDFFE_PP0P_(_SDFFE_):
|
|
1100
|
+
"""module _SDFFE_PP0P_ (D, C, R, E, Q)"""
|
|
1101
|
+
|
|
1102
|
+
|
|
1103
|
+
class _SDFFE_PP1N_(_SDFFE_):
|
|
1104
|
+
"""module _SDFFE_PP1N_ (D, C, R, E, Q)"""
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
class _SDFFE_PP1P_(_SDFFE_):
|
|
1108
|
+
"""module _SDFFE_PP1P_ (D, C, R, E, Q)"""
|
|
1109
|
+
|
|
1110
|
+
|
|
1111
|
+
class _SDFFCE_(ClassNameParameterComponent):
|
|
1112
|
+
"""D-type flip-flop with sync reset and clock enable (with clock enable having priority)"""
|
|
1113
|
+
|
|
1114
|
+
def __init__(self, circuit, name=None):
|
|
1115
|
+
super().__init__(circuit, name)
|
|
1116
|
+
self._clock_edge = self.name_to_level(0)
|
|
1117
|
+
self._reset_level = self.name_to_level(1)
|
|
1118
|
+
self._reset_value = self.name_to_level(2)
|
|
1119
|
+
self._enable_level = self.name_to_level(3)
|
|
1120
|
+
self.add_port(PortIn(self, "C"))
|
|
1121
|
+
self.add_port(PortWire(self, "D"))
|
|
1122
|
+
self.add_port(PortWire(self, "E"))
|
|
1123
|
+
self.add_port(PortWire(self, "R"))
|
|
1124
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
1125
|
+
self._old_C_level = self.C.value
|
|
1126
|
+
|
|
1127
|
+
def default_state(self):
|
|
1128
|
+
self.Q.value = 0
|
|
1129
|
+
|
|
1130
|
+
def update(self):
|
|
1131
|
+
if self.C.value != self._old_C_level and self.C.value == self._clock_edge:
|
|
1132
|
+
if self.E.value == self._enable_level:
|
|
1133
|
+
if self.R.value == self._reset_level:
|
|
1134
|
+
self.Q.value = self._reset_value
|
|
1135
|
+
else:
|
|
1136
|
+
self.Q.value = self.D.value
|
|
1137
|
+
self._old_C_level = self.C.value
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
class _SDFFCE_NN0N_(_SDFFCE_):
|
|
1141
|
+
"""module _SDFFCE_NN0N_ (D, C, R, E, Q)"""
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
class _SDFFCE_NN0P_(_SDFFCE_):
|
|
1145
|
+
"""module _SDFFCE_NN0P_ (D, C, R, E, Q)"""
|
|
1146
|
+
|
|
1147
|
+
|
|
1148
|
+
class _SDFFCE_NN1N_(_SDFFCE_):
|
|
1149
|
+
"""module _SDFFCE_NN1N_ (D, C, R, E, Q)"""
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
class _SDFFCE_NN1P_(_SDFFCE_):
|
|
1153
|
+
"""module _SDFFCE_NN1P_ (D, C, R, E, Q)"""
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
class _SDFFCE_NP0N_(_SDFFCE_):
|
|
1157
|
+
"""module _SDFFCE_NP0N_ (D, C, R, E, Q)"""
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
class _SDFFCE_NP0P_(_SDFFCE_):
|
|
1161
|
+
"""module _SDFFCE_NP0P_ (D, C, R, E, Q)"""
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
class _SDFFCE_NP1N_(_SDFFCE_):
|
|
1165
|
+
"""module _SDFFCE_NP1N_ (D, C, R, E, Q)"""
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
class _SDFFCE_NP1P_(_SDFFCE_):
|
|
1169
|
+
"""module _SDFFCE_NP1P_ (D, C, R, E, Q)"""
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
class _SDFFCE_PN0N_(_SDFFCE_):
|
|
1173
|
+
"""module _SDFFCE_PN0N_ (D, C, R, E, Q)"""
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
class _SDFFCE_PN0P_(_SDFFCE_):
|
|
1177
|
+
"""module _SDFFCE_PN0P_ (D, C, R, E, Q)"""
|
|
1178
|
+
|
|
1179
|
+
|
|
1180
|
+
class _SDFFCE_PN1N_(_SDFFCE_):
|
|
1181
|
+
"""module _SDFFCE_PN1N_ (D, C, R, E, Q)"""
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
class _SDFFCE_PN1P_(_SDFFCE_):
|
|
1185
|
+
"""module _SDFFCE_PN1P_ (D, C, R, E, Q)"""
|
|
1186
|
+
|
|
1187
|
+
|
|
1188
|
+
class _SDFFCE_PP0N_(_SDFFCE_):
|
|
1189
|
+
"""module _SDFFCE_PP0N_ (D, C, R, E, Q)"""
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
class _SDFFCE_PP0P_(_SDFFCE_):
|
|
1193
|
+
"""module _SDFFCE_PP0P_ (D, C, R, E, Q)"""
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
class _SDFFCE_PP1N_(_SDFFCE_):
|
|
1197
|
+
"""module _SDFFCE_PP1N_ (D, C, R, E, Q)"""
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
class _SDFFCE_PP1P_(_SDFFCE_):
|
|
1201
|
+
"""module _SDFFCE_PP1P_ (D, C, R, E, Q)"""
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
class _DLATCH_(ClassNameParameterComponent):
|
|
1205
|
+
"""D-type latch"""
|
|
1206
|
+
|
|
1207
|
+
def __init__(self, circuit, name=None):
|
|
1208
|
+
super().__init__(circuit, name)
|
|
1209
|
+
self._enable_level = self.name_to_level(0)
|
|
1210
|
+
self.add_port(PortIn(self, "E"))
|
|
1211
|
+
self.add_port(PortIn(self, "D"))
|
|
1212
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
1213
|
+
|
|
1214
|
+
def default_state(self):
|
|
1215
|
+
self.Q.value = 0
|
|
1216
|
+
|
|
1217
|
+
def update(self):
|
|
1218
|
+
if self.E.value == self._enable_level:
|
|
1219
|
+
self.Q.value = self.D.value
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
class _DLATCH_N_(_DLATCH_):
|
|
1223
|
+
"""module _DLATCH_N_ (E, D, Q)"""
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
class _DLATCH_P_(_DLATCH_):
|
|
1227
|
+
"""module _DLATCH_P_ (E, D, Q)"""
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
class _DLATCH3_(ClassNameParameterComponent):
|
|
1231
|
+
"""D-type latch with reset"""
|
|
1232
|
+
|
|
1233
|
+
def __init__(self, circuit, name=None):
|
|
1234
|
+
super().__init__(circuit, name)
|
|
1235
|
+
self._enable_level = self.name_to_level(0)
|
|
1236
|
+
self._reset_level = self.name_to_level(1)
|
|
1237
|
+
self._reset_value = self.name_to_level(2)
|
|
1238
|
+
self.add_port(PortIn(self, "E"))
|
|
1239
|
+
self.add_port(PortIn(self, "R"))
|
|
1240
|
+
self.add_port(PortIn(self, "D"))
|
|
1241
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
1242
|
+
|
|
1243
|
+
def default_state(self):
|
|
1244
|
+
self.Q.value = 0
|
|
1245
|
+
|
|
1246
|
+
def update(self):
|
|
1247
|
+
if self.R.value == self._reset_level:
|
|
1248
|
+
self.Q.value = self._reset_value
|
|
1249
|
+
elif self.E.value == self._enable_level:
|
|
1250
|
+
self.Q.value = self.D.value
|
|
1251
|
+
|
|
1252
|
+
|
|
1253
|
+
class _DLATCH_NN0_(_DLATCH3_):
|
|
1254
|
+
"""module _DLATCH_NN0_ (E, R, D, Q)"""
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
class _DLATCH_NN1_(_DLATCH3_):
|
|
1258
|
+
"""module _DLATCH_NN1_ (E, R, D, Q)"""
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
class _DLATCH_NP0_(_DLATCH3_):
|
|
1262
|
+
"""module _DLATCH_NP0_ (E, R, D, Q)"""
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
class _DLATCH_NP1_(_DLATCH3_):
|
|
1266
|
+
"""module _DLATCH_NP1_ (E, R, D, Q)"""
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
class _DLATCH_PN0_(_DLATCH3_):
|
|
1270
|
+
"""module _DLATCH_PN0_ (E, R, D, Q)"""
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
class _DLATCH_PN1_(_DLATCH3_):
|
|
1274
|
+
"""module _DLATCH_PN1_ (E, R, D, Q)"""
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
class _DLATCH_PP0_(_DLATCH3_):
|
|
1278
|
+
"""module _DLATCH_PP0_ (E, R, D, Q)"""
|
|
1279
|
+
|
|
1280
|
+
|
|
1281
|
+
class _DLATCH_PP1_(_DLATCH3_):
|
|
1282
|
+
"""module _DLATCH_PP1_ (E, R, D, Q)"""
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
class _DLATCHSR_(ClassNameParameterComponent):
|
|
1286
|
+
"""D-type latch with set and reset"""
|
|
1287
|
+
|
|
1288
|
+
def __init__(self, circuit, name=None):
|
|
1289
|
+
super().__init__(circuit, name)
|
|
1290
|
+
self._enable_level = self.name_to_level(0)
|
|
1291
|
+
self._set_level = self.name_to_level(1)
|
|
1292
|
+
self._reset_level = self.name_to_level(2)
|
|
1293
|
+
self.add_port(PortIn(self, "E"))
|
|
1294
|
+
self.add_port(PortIn(self, "S"))
|
|
1295
|
+
self.add_port(PortIn(self, "R"))
|
|
1296
|
+
self.add_port(PortIn(self, "D"))
|
|
1297
|
+
self.add_port(PortOutDelta(self, "Q"))
|
|
1298
|
+
|
|
1299
|
+
def default_state(self):
|
|
1300
|
+
self.Q.value = 0
|
|
1301
|
+
|
|
1302
|
+
def update(self):
|
|
1303
|
+
if self.R.value == self._reset_level:
|
|
1304
|
+
self.Q.value = 0
|
|
1305
|
+
elif self.S.value == self._set_level:
|
|
1306
|
+
self.Q.value = 1
|
|
1307
|
+
elif self.E.value == self._enable_level:
|
|
1308
|
+
self.Q.value = self.D.value
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
class _DLATCHSR_NNN_(_DLATCHSR_):
|
|
1312
|
+
"""module _DLATCHSR_NNN_ (E, S, R, D, Q)"""
|
|
1313
|
+
|
|
1314
|
+
|
|
1315
|
+
class _DLATCHSR_NNP_(_DLATCHSR_):
|
|
1316
|
+
"""module _DLATCHSR_NNP_ (E, S, R, D, Q)"""
|
|
1317
|
+
|
|
1318
|
+
|
|
1319
|
+
class _DLATCHSR_NPN_(_DLATCHSR_):
|
|
1320
|
+
"""module _DLATCHSR_NPN_ (E, S, R, D, Q)"""
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
class _DLATCHSR_NPP_(_DLATCHSR_):
|
|
1324
|
+
"""module _DLATCHSR_NPP_ (E, S, R, D, Q)"""
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
class _DLATCHSR_PNN_(_DLATCHSR_):
|
|
1328
|
+
"""module _DLATCHSR_PNN_ (E, S, R, D, Q)"""
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
class _DLATCHSR_PNP_(_DLATCHSR_):
|
|
1332
|
+
"""module _DLATCHSR_PNP_ (E, S, R, D, Q)"""
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
class _DLATCHSR_PPN_(_DLATCHSR_):
|
|
1336
|
+
"""module _DLATCHSR_PPN_ (E, S, R, D, Q)"""
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
class _DLATCHSR_PPP_(_DLATCHSR_):
|
|
1340
|
+
"""module _DLATCHSR_PPP_ (E, S, R, D, Q)"""
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
class _StaticLevel_(Component):
|
|
1344
|
+
"""Yosys component for static logic levels"""
|
|
1345
|
+
|
|
1346
|
+
def __init__(self, circuit, name):
|
|
1347
|
+
super().__init__(circuit, name)
|
|
1348
|
+
self.add_port(PortOutDelta(self, "L"))
|
|
1349
|
+
self.add_port(PortOutDelta(self, "H"))
|
|
1350
|
+
|
|
1351
|
+
def default_state(self):
|
|
1352
|
+
self.L.value = 0
|
|
1353
|
+
self.H.value = 1
|