8
8
from migen .fhdl .namer import Namespace , build_namespace
9
9
from migen .fhdl .conv_output import ConvOutput
10
10
11
-
12
11
def _printsig (ns , s ):
13
12
if s .signed :
14
13
n = "signed "
@@ -27,10 +26,10 @@ def _printintbool(node):
27
26
else :
28
27
return "1'd0" , False
29
28
elif isinstance (node , int ):
29
+ nbits = bits_for (node )
30
30
if node >= 0 :
31
- return str (bits_for ( node ) ) + "'d" + str (node ), False
31
+ return str (nbits ) + "'d" + str (node ), False
32
32
else :
33
- nbits = bits_for (node )
34
33
return str (nbits ) + "'sd" + str (2 ** nbits + node ), True
35
34
else :
36
35
raise TypeError
@@ -152,7 +151,7 @@ def _list_comb_wires(f):
152
151
return r
153
152
154
153
155
- def _printheader (f , ios , name , ns ):
154
+ def _printheader (f , ios , name , ns , asic_syntax = False ):
156
155
sigs = list_signals (f ) | list_special_ios (f , True , True , True )
157
156
special_outs = list_special_ios (f , False , True , True )
158
157
inouts = list_special_ios (f , False , False , True )
@@ -178,44 +177,54 @@ def _printheader(f, ios, name, ns):
178
177
if sig in wires :
179
178
r += "wire " + _printsig (ns , sig ) + ";\n "
180
179
else :
181
- r += "reg " + _printsig (ns , sig ) + " = " + _printexpr (ns , sig .reset )[0 ] + ";\n "
180
+ if asic_syntax :
181
+ r += "reg " + _printsig (ns , sig ) + ";\n "
182
+ else :
183
+ r += "reg " + _printsig (ns , sig ) + " = " + _printexpr (ns , sig .reset )[0 ] + ";\n "
182
184
r += "\n "
183
185
return r
184
186
185
187
186
- def _printcomb (f , ns , display_run ):
188
+ def _printcomb (f , ns , display_run , asic_syntax = False ):
187
189
r = ""
188
190
if f .comb :
189
191
# Generate a dummy event to get the simulator
190
192
# to run the combinatorial process once at the beginning.
191
193
syn_off = "// synthesis translate_off\n "
192
194
syn_on = "// synthesis translate_on\n "
193
- dummy_s = Signal (name_override = "dummy_s" )
194
- r += syn_off
195
- r += "reg " + _printsig (ns , dummy_s ) + ";\n "
196
- r += "initial " + ns .get_name (dummy_s ) + " <= 1'd0;\n "
197
- r += syn_on
195
+ if not asic_syntax :
196
+ dummy_s = Signal (name_override = "dummy_s" )
197
+ r += syn_off
198
+ r += "reg " + _printsig (ns , dummy_s ) + ";\n "
199
+ r += "initial " + ns .get_name (dummy_s ) + " <= 1'd0;\n "
200
+ r += syn_on
198
201
199
202
groups = group_by_targets (f .comb )
200
203
201
204
for n , g in enumerate (groups ):
202
205
if len (g [1 ]) == 1 and isinstance (g [1 ][0 ], _Assign ):
203
206
r += "assign " + _printnode (ns , _AT_BLOCKING , 0 , g [1 ][0 ])
204
207
else :
205
- dummy_d = Signal (name_override = "dummy_d" )
206
- r += "\n " + syn_off
207
- r += "reg " + _printsig (ns , dummy_d ) + ";\n "
208
- r += syn_on
208
+ if not asic_syntax :
209
+ dummy_d = Signal (name_override = "dummy_d" )
210
+ r += "\n " + syn_off
211
+ r += "reg " + _printsig (ns , dummy_d ) + ";\n "
212
+ r += syn_on
209
213
210
214
r += "always @(*) begin\n "
211
215
if display_run :
212
216
r += "\t $display(\" Running comb block #" + str (n ) + "\" );\n "
213
- for t in g [0 ]:
214
- r += "\t " + ns .get_name (t ) + " <= " + _printexpr (ns , t .reset )[0 ] + ";\n "
215
- r += _printnode (ns , _AT_NONBLOCKING , 1 , g [1 ])
216
- r += syn_off
217
- r += "\t " + ns .get_name (dummy_d ) + " <= " + ns .get_name (dummy_s ) + ";\n "
218
- r += syn_on
217
+ if asic_syntax :
218
+ for t in g [0 ]:
219
+ r += "\t " + ns .get_name (t ) + " = " + _printexpr (ns , t .reset )[0 ] + ";\n "
220
+ r += _printnode (ns , _AT_BLOCKING , 1 , g [1 ])
221
+ else :
222
+ for t in g [0 ]:
223
+ r += "\t " + ns .get_name (t ) + " <= " + _printexpr (ns , t .reset )[0 ] + ";\n "
224
+ r += _printnode (ns , _AT_NONBLOCKING , 1 , g [1 ])
225
+ r += syn_off
226
+ r += "\t " + ns .get_name (dummy_d ) + " <= " + ns .get_name (dummy_s ) + ";\n "
227
+ r += syn_on
219
228
r += "end\n "
220
229
r += "\n "
221
230
return r
@@ -284,7 +293,7 @@ def _printspecials(overrides, specials, ns, add_data_file):
284
293
def convert (f , ios = None , name = "top" ,
285
294
special_overrides = dict (),
286
295
create_clock_domains = True ,
287
- display_run = False ):
296
+ display_run = False , asic_syntax = False ):
288
297
r = ConvOutput ()
289
298
if not isinstance (f , _Fragment ):
290
299
f = f .get_fragment ()
@@ -314,8 +323,8 @@ def convert(f, ios=None, name="top",
314
323
r .ns = ns
315
324
316
325
src = "/* Machine-generated using Migen */\n "
317
- src += _printheader (f , ios , name , ns )
318
- src += _printcomb (f , ns , display_run )
326
+ src += _printheader (f , ios , name , ns , asic_syntax )
327
+ src += _printcomb (f , ns , display_run , asic_syntax )
319
328
src += _printsync (f , ns )
320
329
src += _printspecials (special_overrides , f .specials - lowered_specials , ns , r .add_data_file )
321
330
src += "endmodule\n "
0 commit comments