@@ -20,8 +20,8 @@ def __init__(self, m, name, width=32, initname='init'):
20
20
self .state = self .m .Reg (name , width ) # set initval later
21
21
22
22
self .mark = {} # key:index
23
- self .set_mark (0 , self .name + '_' + initname )
24
- self .state .initval = self .get_mark (0 )
23
+ self ._set_mark (0 , self .name + '_' + initname )
24
+ self .state .initval = self ._get_mark (0 )
25
25
26
26
self .body = collections .defaultdict (list )
27
27
self .delay_amount = 0
@@ -38,36 +38,17 @@ def __init__(self, m, name, width=32, initname='init'):
38
38
39
39
#---------------------------------------------------------------------------
40
40
def current (self ):
41
- return self .get_index ()
41
+ return self ._get_index ()
42
42
43
43
def next (self ):
44
- return self .get_index () + 1
44
+ return self ._get_index () + 1
45
45
46
- #---------------------------------------------------------------------------
47
46
def increment (self ):
48
- self .set_index (None )
47
+ self ._set_index (None )
49
48
50
49
def inc (self ):
51
50
self .increment ()
52
51
53
- #---------------------------------------------------------------------------
54
- def set (self , index = None ):
55
- if index is None : index = self .current () + 1
56
- if isinstance (index , vtypes .Localparam ):
57
- index = self .get_mark_index (index )
58
- if index not in self .mark :
59
- self .set_mark (index )
60
- return self .state ( self .mark [index ] )
61
-
62
- def set_init (self ):
63
- return [ self .set (0 ) ] + self .init_delayed_state ()
64
-
65
- def set_next (self ):
66
- return self .set (None )
67
-
68
- def reset (self ):
69
- return self .set_init ()
70
-
71
52
#---------------------------------------------------------------------------
72
53
def goto (self , index = None , cond = None , else_index = None ):
73
54
g = self .set (index )
@@ -88,54 +69,27 @@ def goto_next(self, cond=None):
88
69
return self
89
70
90
71
#---------------------------------------------------------------------------
91
- def prev (self , var , delay , initval = 0 ):
92
- return self .seq .prev (var , delay , initval )
93
-
94
- #---------------------------------------------------------------------------
95
- def add_dst_var (self , statement ):
96
- for s in statement :
97
- values = self .dst_visitor .visit (s )
98
- for v in values :
99
- k = str (v )
100
- if k not in self .dst_var :
101
- self .dst_var [k ] = v
102
-
103
- #---------------------------------------------------------------------------
104
- def add_delayed_cond (self , statement , index , delay ):
105
- name_prefix = '_' .join (['' , self .name , 'cond' , str (index ), str (self .tmp_count )])
106
- self .tmp_count += 1
107
- prev = statement
108
- for i in range (delay ):
109
- tmp_name = '_' .join ([name_prefix , str (i + 1 )])
110
- tmp = self .m .Reg (tmp_name , initval = 0 )
111
- self .add (tmp (prev ), delay = i )
112
- prev = tmp
113
- return prev
72
+ def set (self , index = None ):
73
+ if index is None : index = self .current () + 1
74
+ if isinstance (index , vtypes .Localparam ):
75
+ index = self ._get_mark_index (index )
76
+ if index not in self .mark :
77
+ self ._set_mark (index )
78
+ return self .state ( self .mark [index ] )
79
+
80
+ def set_init (self ):
81
+ return [ self .set (0 ) ] + self ._init_delayed_state ()
82
+
83
+ def set_next (self ):
84
+ return self .set (None )
85
+
86
+ def reset (self ):
87
+ return self .set_init ()
114
88
115
89
#---------------------------------------------------------------------------
116
- def add_delayed_subst (self , subst , index , delay ):
117
- if not isinstance (subst , vtypes .Subst ):
118
- return subst
119
- left = subst .left
120
- right = subst .right
121
- if isinstance (right , (bool , int , float , str ,
122
- vtypes ._Constant , vtypes ._ParameterVairable )):
123
- return subst
124
- width = left .bit_length ()
125
- prev = right
90
+ def prev (self , var , delay , initval = 0 ):
91
+ return self .seq .prev (var , delay , initval )
126
92
127
- name_prefix = ('_' .join (['' , left .name , str (index ), str (self .tmp_count )])
128
- if isinstance (left , vtypes ._Variable ) else
129
- '_' .join (['' , self .name , 'sbst' , str (index ), str (self .tmp_count )]))
130
- self .tmp_count += 1
131
-
132
- for i in range (delay ):
133
- tmp_name = '_' .join ([name_prefix , str (i + 1 )])
134
- tmp = self .m .Reg (tmp_name , width , initval = 0 )
135
- self .add (tmp (prev ), delay = i )
136
- prev = tmp
137
- return left (prev )
138
-
139
93
#---------------------------------------------------------------------------
140
94
def add (self , * statement , ** kwargs ):
141
95
for k in kwargs .keys ():
@@ -156,40 +110,50 @@ def add(self, *statement, **kwargs):
156
110
return self
157
111
158
112
if delay is not None and delay > 0 :
159
- self .add_delayed_state (delay )
113
+ self ._add_delayed_state (delay )
160
114
index = self .current ()
161
115
if eager_val :
162
- statement = [ self .add_delayed_subst (s , index , delay ) for s in statement ]
116
+ statement = [ self ._add_delayed_subst (s , index , delay ) for s in statement ]
163
117
if cond is not None :
164
118
if not lazy_cond :
165
- cond = self .add_delayed_cond (cond , index , delay )
119
+ cond = self ._add_delayed_cond (cond , index , delay )
166
120
statement = [ vtypes .If (cond )(* statement ) ]
167
121
self .delayed_body [delay ][index ].extend (statement )
168
- self .add_dst_var (statement )
122
+ self ._add_dst_var (statement )
169
123
return self
170
124
171
125
if cond is not None :
172
126
statement = [ vtypes .If (cond )(* statement ) ]
173
127
174
128
index = self .current ()
175
129
self .body [index ].extend (statement )
176
- self .add_dst_var (statement )
130
+ self ._add_dst_var (statement )
177
131
return self
178
132
133
+ #---------------------------------------------------------------------------
134
+ def make_always (self , clk , rst , reset = (), body = (), case = True ):
135
+ self .m .Always (vtypes .Posedge (clk ))(
136
+ vtypes .If (rst )(
137
+ self .make_reset (reset )
138
+ )(
139
+ body ,
140
+ self .make_case () if case else self .make_if ()
141
+ ))
142
+
179
143
#---------------------------------------------------------------------------
180
144
def make_case (self ):
181
145
ret = []
182
146
ret .extend ( self .seq .make_code () )
183
- ret .extend ( self .get_delayed_substs () )
147
+ ret .extend ( self ._get_delayed_substs () )
184
148
185
149
for delay , dct in sorted (self .delayed_body .items (),
186
150
key = lambda x :x [0 ], reverse = True ):
187
- body = tuple ([ self .get_delayed_when_statement (index , delay )
151
+ body = tuple ([ self ._get_delayed_when_statement (index , delay )
188
152
for index in sorted (dct .keys (), key = lambda x :x ) ])
189
- case = vtypes .Case (self .get_delayed_state (delay ))(* body )
153
+ case = vtypes .Case (self ._get_delayed_state (delay ))(* body )
190
154
ret .append (case )
191
155
192
- body = tuple ([ self .get_when_statement (index )
156
+ body = tuple ([ self ._get_when_statement (index )
193
157
for index in sorted (self .body .keys (), key = lambda x :x ) ])
194
158
case = vtypes .Case (self .state )(* body )
195
159
ret .append (case )
@@ -199,14 +163,14 @@ def make_case(self):
199
163
def make_if (self ):
200
164
ret = []
201
165
ret .extend ( self .seq .make_code () )
202
- ret .extend ( self .get_delayed_substs () )
166
+ ret .extend ( self ._get_delayed_substs () )
203
167
204
168
for delay , dct in sorted (self .delayed_body .items (),
205
169
key = lambda x :x [0 ], reverse = True ):
206
- ret .append ([ self .get_delayed_if_statement (index , delay )
170
+ ret .append ([ self ._get_delayed_if_statement (index , delay )
207
171
for index in sorted (dct .keys (), key = lambda x :x ) ])
208
172
209
- ret .extend ([ self .get_if_statement (index )
173
+ ret .extend ([ self ._get_if_statement (index )
210
174
for index in sorted (self .body .keys (), key = lambda x :x ) ])
211
175
return tuple (ret )
212
176
@@ -250,48 +214,83 @@ def make_reset(self, reset):
250
214
return list (ret .values ())
251
215
252
216
#---------------------------------------------------------------------------
253
- def make_always (self , clk , rst , reset = (), body = (), case = True ):
254
- self .m .Always (vtypes .Posedge (clk ))(
255
- vtypes .If (rst )(
256
- self .make_reset (reset )
257
- )(
258
- body ,
259
- self .make_case () if case else self .make_if ()
260
- ))
217
+ def _add_dst_var (self , statement ):
218
+ for s in statement :
219
+ values = self .dst_visitor .visit (s )
220
+ for v in values :
221
+ k = str (v )
222
+ if k not in self .dst_var :
223
+ self .dst_var [k ] = v
224
+
225
+ #---------------------------------------------------------------------------
226
+ def _add_delayed_cond (self , statement , index , delay ):
227
+ name_prefix = '_' .join (['' , self .name , 'cond' , str (index ), str (self .tmp_count )])
228
+ self .tmp_count += 1
229
+ prev = statement
230
+ for i in range (delay ):
231
+ tmp_name = '_' .join ([name_prefix , str (i + 1 )])
232
+ tmp = self .m .Reg (tmp_name , initval = 0 )
233
+ self .add (tmp (prev ), delay = i )
234
+ prev = tmp
235
+ return prev
261
236
262
237
#---------------------------------------------------------------------------
263
- def get_index (self ):
238
+ def _add_delayed_subst (self , subst , index , delay ):
239
+ if not isinstance (subst , vtypes .Subst ):
240
+ return subst
241
+ left = subst .left
242
+ right = subst .right
243
+ if isinstance (right , (bool , int , float , str ,
244
+ vtypes ._Constant , vtypes ._ParameterVairable )):
245
+ return subst
246
+ width = left .bit_length ()
247
+ prev = right
248
+
249
+ name_prefix = ('_' .join (['' , left .name , str (index ), str (self .tmp_count )])
250
+ if isinstance (left , vtypes ._Variable ) else
251
+ '_' .join (['' , self .name , 'sbst' , str (index ), str (self .tmp_count )]))
252
+ self .tmp_count += 1
253
+
254
+ for i in range (delay ):
255
+ tmp_name = '_' .join ([name_prefix , str (i + 1 )])
256
+ tmp = self .m .Reg (tmp_name , width , initval = 0 )
257
+ self .add (tmp (prev ), delay = i )
258
+ prev = tmp
259
+ return left (prev )
260
+
261
+ #---------------------------------------------------------------------------
262
+ def _get_index (self ):
264
263
return self .state_count
265
264
266
- def set_index (self , index = None ):
265
+ def _set_index (self , index = None ):
267
266
if index is None :
268
267
self .state_count += 1
269
268
return self .state_count
270
269
self .state_count = index
271
270
return self .state_count
272
271
273
- def get_mark (self , index = None ):
272
+ def _get_mark (self , index = None ):
274
273
if index is None :
275
274
index = self .state_count
276
275
if index not in self .mark :
277
276
raise KeyError ("No such index in FSM marks: %s" % index )
278
277
return self .mark [index ]
279
278
280
- def set_mark (self , index = None , name = None ):
279
+ def _set_mark (self , index = None , name = None ):
281
280
if index is None :
282
281
index = self .state_count
283
282
if name is None :
284
283
name = self .name + '_' + str (index )
285
284
self .mark [index ] = self .m .Localparam (name , index )
286
285
287
- def get_mark_index (self , s ):
286
+ def _get_mark_index (self , s ):
288
287
for index , m in self .mark .items ():
289
288
if m .name == s .name :
290
289
return index
291
290
raise KeyError ("No such mark in FSM marks: %s" % s .name )
292
291
293
292
#---------------------------------------------------------------------------
294
- def add_delayed_state (self , value ):
293
+ def _add_delayed_state (self , value ):
295
294
if not isinstance (value , int ):
296
295
raise TypeError ("Delay amount must be int, not '%s'" % str (type (value )))
297
296
@@ -302,66 +301,65 @@ def add_delayed_state(self, value):
302
301
return self .state
303
302
304
303
if value <= self .delay_amount :
305
- return self .get_delayed_state (value )
304
+ return self ._get_delayed_state (value )
306
305
307
306
for i in range (self .delay_amount + 1 , value + 1 ):
308
307
d = self .m .Reg ('' .join (['_d' , str (i ), '_' , self .name ]), self .width ,
309
- initval = self .get_mark (0 ))
308
+ initval = self ._get_mark (0 ))
310
309
self .delayed_state [i ] = d
311
- ###self.add_dst_var( [d] )
312
310
313
311
self .delay_amount = value
314
312
return d
315
313
316
- def get_delayed_state (self , value ):
314
+ def _get_delayed_state (self , value ):
317
315
if value == 0 : return self .state
318
316
if value not in self .delayed_state :
319
317
raise IndexError ('No such index %d in delayed state' % value )
320
318
return self .delayed_state [value ]
321
319
322
- def get_delayed_substs (self ):
320
+ def _get_delayed_substs (self ):
323
321
ret = []
324
322
prev = self .state
325
323
for d in range (1 , self .delay_amount + 1 ):
326
324
ret .append (vtypes .Subst (self .delayed_state [d ], prev ))
327
325
prev = self .delayed_state [d ]
328
326
return ret
329
327
330
- def init_delayed_state (self ):
328
+ def _init_delayed_state (self ):
331
329
ret = []
332
330
for d in range (1 , self .delay_amount + 1 ):
333
331
ret .append (vtypes .Subst (self .delayed_state [d ], self .mark [0 ]))
334
332
return ret
335
333
336
334
#---------------------------------------------------------------------------
337
- def cond_case (self , index ):
335
+ def _cond_case (self , index ):
338
336
if index not in self .mark :
339
- self .set_mark (index )
337
+ self ._set_mark (index )
340
338
return self .mark [index ]
341
339
342
- def cond_if (self , index ):
340
+ def _cond_if (self , index ):
343
341
if index not in self .mark :
344
- self .set_mark (index )
342
+ self ._set_mark (index )
345
343
return (self .state == self .mark [index ])
346
344
347
- def delayed_cond_if (self , index , delay ):
345
+ def _delayed_cond_if (self , index , delay ):
348
346
if index not in self .mark :
349
- self .set_mark (index )
347
+ self ._set_mark (index )
350
348
if delay > 0 and delay not in self .delayed_state :
351
- self .add_delayed_state (delay )
352
- return (self .get_delayed_state (delay ) == self .mark [index ])
349
+ self ._add_delayed_state (delay )
350
+ return (self ._get_delayed_state (delay ) == self .mark [index ])
353
351
354
- def get_when_statement (self , index ):
355
- return vtypes .When (self .cond_case (index ))( * self .body [index ] )
352
+ def _get_when_statement (self , index ):
353
+ return vtypes .When (self ._cond_case (index ))( * self .body [index ] )
356
354
357
- def get_delayed_when_statement (self , index , delay ):
358
- return vtypes .When (self .cond_case (index ))( * self .delayed_body [delay ][index ] )
355
+ def _get_delayed_when_statement (self , index , delay ):
356
+ return vtypes .When (self ._cond_case (index ))( * self .delayed_body [delay ][index ] )
359
357
360
- def get_if_statement (self , index ):
361
- return vtypes .If (self .cond_if (index ))( * self .body [index ] )
358
+ def _get_if_statement (self , index ):
359
+ return vtypes .If (self ._cond_if (index ))( * self .body [index ] )
362
360
363
- def get_delayed_if_statement (self , index , delay ):
364
- return vtypes .If (self .delayed_cond_if (index , delay ))( * self .delayed_body [delay ][index ] )
361
+ def _get_delayed_if_statement (self , index , delay ):
362
+ return vtypes .If (self ._delayed_cond_if (index , delay ))( * self .delayed_body [delay ][index ] )
365
363
366
364
#---------------------------------------------------------------------------
367
365
def __call__ (self , * statement , ** kwargs ):
@@ -372,4 +370,3 @@ def __getitem__(self, index):
372
370
373
371
def __len__ (self ):
374
372
return self .state_count + 1
375
-
0 commit comments