Skip to content

Commit b34d043

Browse files
committed
If statement nest is updated.
1 parent 97b197a commit b34d043

File tree

5 files changed

+73
-35
lines changed

5 files changed

+73
-35
lines changed

sample/bram/bram.py

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ def mkBram(name):
2727
d_addr = m.Reg('d_' + addr.name, datawidth)
2828
mem = m.Reg('mem', datawidth, addrwidth)
2929

30-
m.Always(Posedge(clk),
31-
[ If(write, [ mem[addr].set(datain) ]),
32-
d_addr.set(addr) ])
33-
m.Assign(dataout, mem[d_addr])
30+
m.Always(Posedge(clk))(
31+
If(write)( mem[addr](datain) ),
32+
d_addr(addr)
33+
)
34+
m.Assign(dataout(mem[d_addr]))
3435

3536
return m
3637

@@ -57,17 +58,23 @@ def cond(name='label'):
5758
return ret
5859

5960
def goto_next():
60-
return state.set( state + 1 )
61+
return state( state + 1 )
6162

62-
m.Always(Posedge(clk),
63-
( If(rst,
64-
( addr.set(0), datain.set(0), write.set(0), state.set(0) ),
65-
( If(cond(), ( addr.set(0), datain.set(0), write.set(0), goto_next() )),
66-
If(cond(), ( write.set(1), datain.set(datain + 4), goto_next() )),
67-
If(cond(), ( write.set(0), goto_next() )),
68-
If(cond(), ( If(addr == 128,
69-
( addr.set(0), state.set(label[0]) ),
70-
( addr.set(addr + 1), state.set(label[1]) ))))))))
63+
m.Always(Posedge(clk))(
64+
If(rst)(
65+
addr(0), datain(0), write(0), state(0)
66+
).els(
67+
If(cond())( addr(0), datain(0), write(0), goto_next() ),
68+
If(cond())( write(1), datain(datain + 4), goto_next() ),
69+
If(cond())( write(0), goto_next() ),
70+
If(cond())(
71+
If(addr == 128)(
72+
addr(0), state(label[0])
73+
).els(
74+
addr(addr + 1), state(label[1])
75+
)
76+
)))
77+
7178
return m
7279

7380
#-------------------------------------------------------------------------------

sample/led/led.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,21 @@ def mkLed():
1212
led = m.OutputReg('LED', width)
1313
count = m.Reg('count', 32)
1414

15-
m.Always(Posedge(clk),
16-
( If(rst,
17-
( count.set(0), ),
18-
( count.set(count + 1), )), ))
15+
m.Always(Posedge(clk))(
16+
If(rst)(
17+
count(0)
18+
).els(
19+
count(count + 1)
20+
))
1921

20-
m.Always(Posedge(clk),
21-
( If(rst,
22-
( led.set(0), ),
23-
( If(count == 1024 - 1,
24-
( led.set(led + 1), )))), ))
22+
m.Always(Posedge(clk))(
23+
If(rst)(
24+
led(0)
25+
).els(
26+
If(count == 1024 - 1)(
27+
led(led + 1)
28+
)
29+
))
2530

2631
return m
2732

veriloggen/module.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ def Localparam(self, name, value, width=None, signed=False, length=None):
7979
return t
8080

8181
#---------------------------------------------------------------------------
82-
def Always(self, sensitivity, statement):
83-
t = vtypes.Always(sensitivity, statement)
82+
def Always(self, sensitivity, *statement):
83+
t = vtypes.Always(sensitivity, *statement)
8484
self.always.append(t)
8585
return t
8686

87-
def Assign(self, left, right):
88-
t = vtypes.Assign(left, right)
87+
def Assign(self, statement):
88+
t = vtypes.Assign(statement)
8989
self.assign.append(t)
9090
return t
9191

veriloggen/toverilog.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,10 @@ def visit_Always(self, node):
125125

126126
#---------------------------------------------------------------------------
127127
def visit_Assign(self, node):
128-
left = self.bind_visitor.visit(node.left)
129-
right = self.bind_visitor.visit(node.right)
128+
if not isinstance(node.statement, vtypes.Subst):
129+
raise TypeError("Assign expects Subst object.")
130+
left = self.bind_visitor.visit(node.statement.left)
131+
right = self.bind_visitor.visit(node.statement.right)
130132
return vast.Assign(left, right)
131133

132134
#---------------------------------------------------------------------------

veriloggen/vtypes.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ def assign(self, r):
7070
def set(self, r):
7171
return self.assign(r)
7272

73+
def __call__(self, r):
74+
return self.assign(r)
75+
7376
def __ilshift__(self, r):
7477
return self.assign(r)
7578

@@ -78,6 +81,7 @@ def __setattr__(self, name, value):
7881
return self.assign(value)
7982
else:
8083
_Numeric.__setattr__(self, name, value)
84+
8185

8286
#-------------------------------------------------------------------------------
8387
class Reg(_Variable): pass
@@ -195,14 +199,19 @@ def __init__(self, var, step):
195199

196200
#-------------------------------------------------------------------------------
197201
class Always(_VtypesObject):
198-
def __init__(self, sensitivity, statement):
202+
def __init__(self, sensitivity, *statement):
199203
self.sensitivity = sensitivity
200-
self.statement = statement
204+
self.statement = tuple(statement)
205+
206+
def __call__(self, *statement):
207+
if self.statement:
208+
raise ValueError("Statement is already assigned.")
209+
self.statement = tuple(statement)
210+
return self
201211

202212
class Assign(_VtypesObject):
203-
def __init__(self, left, right):
204-
self.left = left
205-
self.right = right
213+
def __init__(self, statement):
214+
self.statement = statement
206215

207216
#-------------------------------------------------------------------------------
208217
class Edge(_VtypesObject):
@@ -219,11 +228,26 @@ def __init__(self, left, right):
219228
self.right = right
220229

221230
class If(_VtypesObject):
222-
def __init__(self, condition, true_statement, false_statement=None):
231+
def __init__(self, condition, true_statement=None, false_statement=None):
223232
self.condition = condition
224233
self.true_statement = true_statement
225234
self.false_statement = false_statement
226235

236+
def __call__(self, *args):
237+
if self.true_statement is None:
238+
self.true_statement = tuple(args)
239+
return self
240+
if self.false_statement is None:
241+
self.false_statement = tuple(args)
242+
return self
243+
raise ValueError("True statement and False statement are already assigned.")
244+
245+
def els(self, *args):
246+
if self.false_statement is None:
247+
self.false_statement = tuple(args)
248+
return self
249+
raise ValueError("False statement is already assigned.")
250+
227251
class For(_VtypesObject):
228252
def __init__(self, pre, condition, post, statement):
229253
self.pre = pre

0 commit comments

Comments
 (0)