@@ -20,8 +20,8 @@ def __init__(self, m, name, width=32, initname='init'):
2020 self .state = self .m .Reg (name , width ) # set initval later
2121
2222 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 )
2525
2626 self .body = collections .defaultdict (list )
2727 self .delay_amount = 0
@@ -38,36 +38,17 @@ def __init__(self, m, name, width=32, initname='init'):
3838
3939 #---------------------------------------------------------------------------
4040 def current (self ):
41- return self .get_index ()
41+ return self ._get_index ()
4242
4343 def next (self ):
44- return self .get_index () + 1
44+ return self ._get_index () + 1
4545
46- #---------------------------------------------------------------------------
4746 def increment (self ):
48- self .set_index (None )
47+ self ._set_index (None )
4948
5049 def inc (self ):
5150 self .increment ()
5251
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-
7152 #---------------------------------------------------------------------------
7253 def goto (self , index = None , cond = None , else_index = None ):
7354 g = self .set (index )
@@ -88,54 +69,27 @@ def goto_next(self, cond=None):
8869 return self
8970
9071 #---------------------------------------------------------------------------
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 ()
11488
11589 #---------------------------------------------------------------------------
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 )
12692
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-
13993 #---------------------------------------------------------------------------
14094 def add (self , * statement , ** kwargs ):
14195 for k in kwargs .keys ():
@@ -156,40 +110,50 @@ def add(self, *statement, **kwargs):
156110 return self
157111
158112 if delay is not None and delay > 0 :
159- self .add_delayed_state (delay )
113+ self ._add_delayed_state (delay )
160114 index = self .current ()
161115 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 ]
163117 if cond is not None :
164118 if not lazy_cond :
165- cond = self .add_delayed_cond (cond , index , delay )
119+ cond = self ._add_delayed_cond (cond , index , delay )
166120 statement = [ vtypes .If (cond )(* statement ) ]
167121 self .delayed_body [delay ][index ].extend (statement )
168- self .add_dst_var (statement )
122+ self ._add_dst_var (statement )
169123 return self
170124
171125 if cond is not None :
172126 statement = [ vtypes .If (cond )(* statement ) ]
173127
174128 index = self .current ()
175129 self .body [index ].extend (statement )
176- self .add_dst_var (statement )
130+ self ._add_dst_var (statement )
177131 return self
178132
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+
179143 #---------------------------------------------------------------------------
180144 def make_case (self ):
181145 ret = []
182146 ret .extend ( self .seq .make_code () )
183- ret .extend ( self .get_delayed_substs () )
147+ ret .extend ( self ._get_delayed_substs () )
184148
185149 for delay , dct in sorted (self .delayed_body .items (),
186150 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 )
188152 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 )
190154 ret .append (case )
191155
192- body = tuple ([ self .get_when_statement (index )
156+ body = tuple ([ self ._get_when_statement (index )
193157 for index in sorted (self .body .keys (), key = lambda x :x ) ])
194158 case = vtypes .Case (self .state )(* body )
195159 ret .append (case )
@@ -199,14 +163,14 @@ def make_case(self):
199163 def make_if (self ):
200164 ret = []
201165 ret .extend ( self .seq .make_code () )
202- ret .extend ( self .get_delayed_substs () )
166+ ret .extend ( self ._get_delayed_substs () )
203167
204168 for delay , dct in sorted (self .delayed_body .items (),
205169 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 )
207171 for index in sorted (dct .keys (), key = lambda x :x ) ])
208172
209- ret .extend ([ self .get_if_statement (index )
173+ ret .extend ([ self ._get_if_statement (index )
210174 for index in sorted (self .body .keys (), key = lambda x :x ) ])
211175 return tuple (ret )
212176
@@ -250,48 +214,83 @@ def make_reset(self, reset):
250214 return list (ret .values ())
251215
252216 #---------------------------------------------------------------------------
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
261236
262237 #---------------------------------------------------------------------------
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 ):
264263 return self .state_count
265264
266- def set_index (self , index = None ):
265+ def _set_index (self , index = None ):
267266 if index is None :
268267 self .state_count += 1
269268 return self .state_count
270269 self .state_count = index
271270 return self .state_count
272271
273- def get_mark (self , index = None ):
272+ def _get_mark (self , index = None ):
274273 if index is None :
275274 index = self .state_count
276275 if index not in self .mark :
277276 raise KeyError ("No such index in FSM marks: %s" % index )
278277 return self .mark [index ]
279278
280- def set_mark (self , index = None , name = None ):
279+ def _set_mark (self , index = None , name = None ):
281280 if index is None :
282281 index = self .state_count
283282 if name is None :
284283 name = self .name + '_' + str (index )
285284 self .mark [index ] = self .m .Localparam (name , index )
286285
287- def get_mark_index (self , s ):
286+ def _get_mark_index (self , s ):
288287 for index , m in self .mark .items ():
289288 if m .name == s .name :
290289 return index
291290 raise KeyError ("No such mark in FSM marks: %s" % s .name )
292291
293292 #---------------------------------------------------------------------------
294- def add_delayed_state (self , value ):
293+ def _add_delayed_state (self , value ):
295294 if not isinstance (value , int ):
296295 raise TypeError ("Delay amount must be int, not '%s'" % str (type (value )))
297296
@@ -302,66 +301,65 @@ def add_delayed_state(self, value):
302301 return self .state
303302
304303 if value <= self .delay_amount :
305- return self .get_delayed_state (value )
304+ return self ._get_delayed_state (value )
306305
307306 for i in range (self .delay_amount + 1 , value + 1 ):
308307 d = self .m .Reg ('' .join (['_d' , str (i ), '_' , self .name ]), self .width ,
309- initval = self .get_mark (0 ))
308+ initval = self ._get_mark (0 ))
310309 self .delayed_state [i ] = d
311- ###self.add_dst_var( [d] )
312310
313311 self .delay_amount = value
314312 return d
315313
316- def get_delayed_state (self , value ):
314+ def _get_delayed_state (self , value ):
317315 if value == 0 : return self .state
318316 if value not in self .delayed_state :
319317 raise IndexError ('No such index %d in delayed state' % value )
320318 return self .delayed_state [value ]
321319
322- def get_delayed_substs (self ):
320+ def _get_delayed_substs (self ):
323321 ret = []
324322 prev = self .state
325323 for d in range (1 , self .delay_amount + 1 ):
326324 ret .append (vtypes .Subst (self .delayed_state [d ], prev ))
327325 prev = self .delayed_state [d ]
328326 return ret
329327
330- def init_delayed_state (self ):
328+ def _init_delayed_state (self ):
331329 ret = []
332330 for d in range (1 , self .delay_amount + 1 ):
333331 ret .append (vtypes .Subst (self .delayed_state [d ], self .mark [0 ]))
334332 return ret
335333
336334 #---------------------------------------------------------------------------
337- def cond_case (self , index ):
335+ def _cond_case (self , index ):
338336 if index not in self .mark :
339- self .set_mark (index )
337+ self ._set_mark (index )
340338 return self .mark [index ]
341339
342- def cond_if (self , index ):
340+ def _cond_if (self , index ):
343341 if index not in self .mark :
344- self .set_mark (index )
342+ self ._set_mark (index )
345343 return (self .state == self .mark [index ])
346344
347- def delayed_cond_if (self , index , delay ):
345+ def _delayed_cond_if (self , index , delay ):
348346 if index not in self .mark :
349- self .set_mark (index )
347+ self ._set_mark (index )
350348 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 ])
353351
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 ] )
356354
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 ] )
359357
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 ] )
362360
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 ] )
365363
366364 #---------------------------------------------------------------------------
367365 def __call__ (self , * statement , ** kwargs ):
@@ -372,4 +370,3 @@ def __getitem__(self, index):
372370
373371 def __len__ (self ):
374372 return self .state_count + 1
375-
0 commit comments