1+ import collections
12import vtypes
23
34#-------------------------------------------------------------------------------
@@ -8,26 +9,29 @@ def __init__(self, m, name, width=32, initname='init'):
89 self .name = name
910 self .state = self .m .Reg (name , width )
1011 self .state_count = 0
11- self .mark = {}
12+ self .mark = collections . OrderedDict ()
1213 self .set_mark (0 , self .name + '_' + initname )
14+ self .body = collections .OrderedDict ()
1315
14- def get_index (self ):
15- return self .state_count
16-
1716 def init (self ):
1817 return self .goto (0 )
1918
2019 def next (self ):
21- index = self .state_count + 1
20+ index = self .get_index () + 1
2221 if index not in self .mark :
2322 self .set_mark (index )
2423 return self .state ( self .mark [index ] )
2524
2625 def goto (self , index ):
26+ if isinstance (index , vtypes .Localparam ):
27+ index = self .get_mark_index (index )
2728 if index not in self .mark :
2829 self .set_mark (index )
2930 return self .state ( self .mark [index ] )
3031
32+ def get_index (self ):
33+ return self .state_count
34+
3135 def set_mark (self , index = None , name = None ):
3236 if index is None :
3337 index = self .state_count
@@ -38,21 +42,45 @@ def set_mark(self, index=None, name=None):
3842 def get_mark (self , index = None ):
3943 if index is None :
4044 index = self .state_count
45+ if index not in self .mark :
46+ raise KeyError ("No such index in FSM marks: %s" % index )
4147 return self .mark [index ]
42-
43- def cond (self ):
44- ret = (self .state == self .mark [self .state_count ])
45- self .state_count += 1
48+
49+ def get_mark_index (self , s ):
50+ for index , m in self .mark .items ():
51+ if m .name == s .name :
52+ return index
53+ raise KeyError ("No such mark in FSM marks: %s" % s .name )
54+
55+ def add (self , * statement ):
56+ index = self .get_index ()
57+ self .body [index ] = statement # tuple
58+ self .update_state ()
59+ ret = self .get (index )
4660 return ret
4761
48- def add_stage (self , * statement ):
49- return vtypes .If (self .cond ())( * statement )
62+ def get (self , index ):
63+ return vtypes .If (self .cond (index ))( * self .body [index ] ) # tuple
64+
65+ def get_all (self ):
66+ ret = []
67+ for index in self .body .keys ():
68+ ret .append (self .get (index ))
69+ return tuple (ret )
5070
71+ def update_state (self ):
72+ self .state_count += 1
73+
74+ def cond (self , index ):
75+ if index not in self .mark :
76+ self .set_mark (index )
77+ return (self .state == self .mark [index ])
78+
5179 def __call__ (self , * statement ):
52- return self .add_stage (* statement )
80+ return self .add (* statement )
5381
5482 def __getitem__ (self , index ):
55- return self .mark [index ]
83+ return self .body [index ]
5684
5785 def __len__ (self ):
5886 return self .state_count + 1
0 commit comments