Skip to content

Commit ab4a919

Browse files
committed
lib.FSM is upgraded.
1 parent 74b8407 commit ab4a919

File tree

7 files changed

+122
-38
lines changed

7 files changed

+122
-38
lines changed

sample/bram/bram.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,29 +72,28 @@ def mkTop():
7272

7373
m.Instance(mkBram('my_'), 'inst_bram', params, ports)
7474

75+
# FSM definition
7576
fsm = lib.FSM(m, 'fsm')
7677
init = fsm.get_index()
77-
fsmbody = []
78-
fsmbody.append(
79-
fsm( bramif.addr(0), bramif.datain(0), bramif.write(0), fsm.next() ))
78+
79+
fsm( bramif.addr(0), bramif.datain(0), bramif.write(0), fsm.next() )
8080
first = fsm.get_index()
81-
fsmbody.append(
82-
fsm( bramif.datain(bramif.datain + 4), fsm.next() ))
83-
fsmbody.append(
84-
fsm( bramif.write(0), fsm.next() ))
85-
fsmbody.append(
86-
fsm(
87-
If(bramif.addr == 128)(
88-
bramif.addr(0), fsm.goto(init)
89-
).Else(
90-
bramif.addr(bramif.addr + 1), fsm.goto(first)
91-
)))
81+
82+
fsm( bramif.datain(bramif.datain + 4), fsm.next() )
83+
fsm( bramif.write(0), fsm.next() )
84+
fsm(
85+
If(bramif.addr == 128)(
86+
bramif.addr(0), fsm.goto(init)
87+
).Else(
88+
bramif.addr(bramif.addr + 1), fsm.goto(first)
89+
))
9290

9391
m.Always(Posedge(clk))(
9492
If(rst)(
9593
bramif.addr(0), bramif.datain(0), bramif.write(0), fsm.init()
9694
).Else(
97-
*fsmbody
95+
# inserting FSM body
96+
*fsm.get_all()
9897
))
9998

10099
return m

sample/long-fsm/Makefile

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
TARGET=led.py
2+
ARGS=
3+
4+
PYTHON=python3
5+
#PYTHON=python
6+
#OPT=-m pdb
7+
#OPT=-m cProfile -s time
8+
#OPT=-m cProfile -o profile.rslt
9+
10+
.PHONY: all
11+
all: run
12+
13+
.PHONY: run
14+
run:
15+
$(PYTHON) $(OPT) $(TARGET) $(ARGS)
16+
17+
.PHONY: check
18+
check:
19+
$(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v
20+
iverilog -tnull -Wall tmp.v
21+
rm -f tmp.v
22+
23+
.PHONY: clean
24+
clean:
25+
rm -rf *.pyc __pycache__ parsetab.py *.out tmp.v

sample/long-fsm/led.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import sys
2+
import os
3+
from veriloggen import *
4+
5+
def mkLed():
6+
m = Module('blinkled')
7+
width = m.Parameter('WIDTH', 8)
8+
clk = m.Input('CLK')
9+
rst = m.Input('RST')
10+
led = m.OutputReg('LED', width)
11+
12+
fsm = lib.FSM(m, 'fsm')
13+
init = fsm.get_index()
14+
for i in range(1023):
15+
fsm( fsm.next() )
16+
fsm( led(led + 1), fsm.goto(init) )
17+
18+
m.Always(Posedge(clk))(
19+
If(rst)(
20+
led(0),
21+
fsm.init()
22+
).Else(
23+
*fsm.get_all()
24+
))
25+
26+
return m
27+
28+
if __name__ == '__main__':
29+
led = mkLed()
30+
# led.to_verilog(filename='tmp.v')
31+
verilog = led.to_verilog()
32+
print(verilog)

sample/long-fsm/veriloggen

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../veriloggen

sample/test/lib-fsm/led.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,18 @@ def mkLed():
1515
# get the initial index (= 0)
1616
init = fsm.get_index()
1717

18-
fsm_body = []
19-
fsm_body.append( fsm(count(count + 1), fsm.next()) )
20-
fsm_body.append( fsm(count(count + 2), fsm.next()) )
18+
fsm(count(count + 1), fsm.next())
19+
fsm(count(count + 2), fsm.next())
2120

2221
# get the current index (= 2)
2322
here = fsm.get_index()
24-
25-
fsm_body.append( fsm(count(count + 3), fsm.next()) )
26-
23+
fsm(count(count + 3), fsm.next())
24+
2725
# jump by using label "init"
28-
fsm_body.append( fsm(If(count < 1024)( fsm.goto(init) ).Else( fsm.next() )) )
26+
fsm(If(count < 1024)( fsm.goto(init) ).Else( fsm.next() ))
2927

3028
# jump by using label "here"
31-
fsm_body.append( fsm(led(led + 1), fsm.goto(here)) )
29+
fsm(led(led + 1), fsm.goto(here))
3230

3331
m.Always(Posedge(clk))(
3432
If(rst)(
@@ -37,7 +35,7 @@ def mkLed():
3735
fsm.init()
3836
).Else(
3937
# inserting the FSM body
40-
*fsm_body
38+
*fsm.get_all()
4139
))
4240

4341
return m

veriloggen/lib.py

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import collections
12
import 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

veriloggen/vtypes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,13 @@ def __getitem__(self, r):
6262

6363
#-------------------------------------------------------------------------------
6464
class _Variable(_Numeric):
65-
def __init__(self, name, width=1, length=None, signed=False, value=None):
65+
def __init__(self, name, width=1, length=None, signed=False, value=None, initvalue=None):
6666
self.name = name
6767
self.width = width
6868
self.length = length
6969
self.signed = signed
7070
self.value = value
71+
self.initvalue = initvalue
7172

7273
def __call__(self, r):
7374
return Subst(self, r)

0 commit comments

Comments
 (0)