Skip to content

Commit 952ba9f

Browse files
committed
ObjectLike methods are implemented.
1 parent a3a9fa7 commit 952ba9f

File tree

4 files changed

+266
-0
lines changed

4 files changed

+266
-0
lines changed

tests/core/like/Makefile

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
TARGET=$(shell ls *.py | grep -v test | grep -v parsetab.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: test
12+
13+
.PHONY: run
14+
run:
15+
$(PYTHON) $(OPT) $(TARGET) $(ARGS)
16+
17+
.PHONY: test
18+
test:
19+
$(PYTHON) -m pytest -vv
20+
21+
.PHONY: check
22+
check:
23+
$(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v
24+
iverilog -tnull -Wall tmp.v
25+
rm -f tmp.v
26+
27+
.PHONY: clean
28+
clean:
29+
rm -rf *.pyc __pycache__ parsetab.py *.out tmp.v uut.vcd

tests/core/like/like.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
6+
# the next line can be removed after installation
7+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
8+
9+
from veriloggen import *
10+
11+
def mkLed():
12+
m = Module('blinkled')
13+
width = m.Parameter('WIDTH', 8)
14+
clk = m.Input('CLK')
15+
rst = m.Input('RST')
16+
17+
led = m.Output('LED', width)
18+
count = m.Reg('count', 32)
19+
20+
# reg with same name
21+
_led = m.RegLike(led)
22+
23+
# output with same name
24+
_count = m.OutputLike(count)
25+
26+
# signals with different name
27+
width1 = m.ParameterLike(width, name='WIDTH1')
28+
width2 = m.LocalparamLike(width, name='WIDTH2')
29+
30+
input_count = m.OutputLike(count, name='input_count')
31+
output_count = m.OutputLike(count, name='output_count')
32+
wire_count = m.WireLike(count, name='wire_count')
33+
reg_count = m.RegLike(count, name='reg_count', initval=8)
34+
35+
m.Assign( wire_count(input_count) )
36+
m.Assign( output_count(reg_count) )
37+
38+
m.Always(Posedge(clk))(
39+
If(rst)(
40+
m.make_reset()
41+
).Else(
42+
reg_count(wire_count)
43+
))
44+
45+
m.Always(Posedge(clk))(
46+
If(rst)(
47+
count(0)
48+
).Else(
49+
If(count == 1023)(
50+
count(0)
51+
).Else(
52+
count(count + 1)
53+
)
54+
))
55+
56+
m.Always(Posedge(clk))(
57+
If(rst)(
58+
led(0)
59+
).Else(
60+
If(count == 1023)(
61+
led(led + 1)
62+
)
63+
))
64+
65+
return m
66+
67+
if __name__ == '__main__':
68+
led = mkLed()
69+
verilog = led.to_verilog()
70+
print(verilog)

tests/core/like/test_like.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import like
4+
5+
expected_verilog = """
6+
module blinkled #
7+
(
8+
parameter WIDTH = 8,
9+
parameter WIDTH1 = 8
10+
)
11+
(
12+
input CLK,
13+
input RST,
14+
output reg [WIDTH-1:0] LED,
15+
output reg [32-1:0] count,
16+
output [32-1:0] input_count,
17+
output [32-1:0] output_count
18+
);
19+
20+
localparam WIDTH2 = 8;
21+
22+
wire [32-1:0] wire_count;
23+
reg [32-1:0] reg_count;
24+
assign wire_count = input_count;
25+
assign output_count = reg_count;
26+
27+
always @(posedge CLK) begin
28+
if(RST) begin
29+
reg_count <= 8;
30+
end else begin
31+
reg_count <= wire_count;
32+
end
33+
end
34+
35+
always @(posedge CLK) begin
36+
if(RST) begin
37+
count <= 0;
38+
end else begin
39+
if(count == 1023) begin
40+
count <= 0;
41+
end else begin
42+
count <= count + 1;
43+
end
44+
end
45+
end
46+
always @(posedge CLK) begin
47+
if(RST) begin
48+
LED <= 0;
49+
end else begin
50+
if(count == 1023) begin
51+
LED <= LED + 1;
52+
end
53+
end
54+
end
55+
endmodule
56+
"""
57+
58+
def test():
59+
test_module = like.mkLed()
60+
code = test_module.to_verilog()
61+
62+
from pyverilog.vparser.parser import VerilogParser
63+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
64+
parser = VerilogParser()
65+
expected_ast = parser.parse(expected_verilog)
66+
codegen = ASTCodeGenerator()
67+
expected_code = codegen.visit(expected_ast)
68+
69+
assert(expected_code == code)

veriloggen/core/module.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,104 @@ def TmpLocalparam(self, value, width=None, signed=False, length=None):
156156
self.tmp_count += 1
157157
return self.Localparam(name, value, width, signed, length)
158158

159+
#---------------------------------------------------------------------------
160+
def InputLike(self, src, name=None, width=None, length=None, signed=None, value=None):
161+
if name is None: name = src.name
162+
if width is None: width = src.width
163+
#if length is None: length = src.length
164+
if length is None: length = None
165+
if signed is None: signed = src.signed
166+
if value is None: value = src.value
167+
return self.Input(name, width, length, signed, value)
168+
169+
def OutputLike(self, src, name=None, width=None, length=None, signed=None, value=None):
170+
if name is None: name = src.name
171+
if width is None: width = src.width
172+
#if length is None: length = src.length
173+
if length is None: length = None
174+
if signed is None: signed = src.signed
175+
if value is None: value = src.value
176+
return self.Output(name, width, length, signed, value)
177+
178+
def OutputRegLike(self, src, name=None, width=None, length=None, signed=None, value=None, initval=None):
179+
if name is None: name = src.name
180+
if width is None: width = src.width
181+
#if length is None: length = src.length
182+
if length is None: length = None
183+
if signed is None: signed = src.signed
184+
if value is None: value = src.value
185+
if initval is None: initval = src.initval
186+
return self.OutputReg(name, width, length, signed, value, initval)
187+
188+
def InoutLike(self, src, name=None, width=None, length=None, signed=None, value=None):
189+
if name is None: name = src.name
190+
if width is None: width = src.width
191+
#if length is None: length = src.length
192+
if length is None: length = None
193+
if signed is None: signed = src.signed
194+
if value is None: value = src.value
195+
return self.Inout(name, width, length, signed, value)
196+
197+
def WireLike(self, src, name=None, width=None, length=None, signed=None, value=None):
198+
if name is None: name = src.name
199+
if width is None: width = src.width
200+
if length is None: length = src.length
201+
if signed is None: signed = src.signed
202+
if value is None: value = src.value
203+
return self.Wire(name, width, length, signed, value)
204+
205+
def RegLike(self, src, name=None, width=None, length=None, signed=None, value=None, initval=None):
206+
if name is None: name = src.name
207+
if width is None: width = src.width
208+
if length is None: length = src.length
209+
if signed is None: signed = src.signed
210+
if value is None: value = src.value
211+
if initval is None: initval = src.initval
212+
return self.Reg(name, width, length, signed, value, initval)
213+
214+
def IntegerLike(self, src, name=None, width=None, length=None, signed=None, value=None, initval=None):
215+
if name is None: name = src.name
216+
if width is None: width = src.width
217+
if length is None: length = src.length
218+
if signed is None: signed = src.signed
219+
if value is None: value = src.value
220+
if initval is None: initval = src.initval
221+
return self.Integer(name, width, length, signed, value, initval)
222+
223+
def RealLike(self, src, name=None, width=None, length=None, signed=None, value=None, initval=None):
224+
if name is None: name = src.name
225+
if width is None: width = src.width
226+
if length is None: length = src.length
227+
if signed is None: signed = src.signed
228+
if value is None: value = src.value
229+
if initval is None: initval = src.initval
230+
return self.Real(name, width, length, signed, value, initval)
231+
232+
def GenvarLike(self, src, name=None, width=None, length=None, signed=None, value=None):
233+
if name is None: name = src.name
234+
if width is None: width = src.width
235+
#if length is None: length = src.length
236+
if length is None: length = None
237+
if signed is None: signed = src.signed
238+
if value is None: value = src.value
239+
return self.Genvar(name, width, length, signed, value)
240+
241+
def ParameterLike(self, src, name=None, value=None, width=None, signed=False, length=None):
242+
if name is None: name = src.name
243+
if value is None: value = src.value
244+
if width is None: width = src.width
245+
if signed is None: signed = src.signed
246+
if length is None: length = src.length
247+
return self.Parameter(name, value, width, signed, length)
248+
249+
def LocalparamLike(self, src, name=None, value=None, width=None, signed=False, length=None):
250+
if name is None: name = src.name
251+
if value is None: value = src.value
252+
if width is None: width = src.width
253+
if signed is None: signed = src.signed
254+
if length is None: length = src.length
255+
return self.Localparam(name, value, width, signed, length)
256+
159257
#---------------------------------------------------------------------------
160258
# User interface for control statements
161259
#---------------------------------------------------------------------------

0 commit comments

Comments
 (0)