Skip to content

Commit a80f984

Browse files
committed
visit_Instance() in from_verilog.read_verilog_module returns an Instance object with a child Module definition, not StubModule.
1 parent 2b398d9 commit a80f984

File tree

8 files changed

+87
-62
lines changed

8 files changed

+87
-62
lines changed

tests/verilog/read_verilog_/branchpredunit/read_verilog_branchpredunit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ def mkMips():
1616

1717
if __name__ == '__main__':
1818
mips_modules = mkMips()
19-
verilog = ''.join([ m.to_verilog() for m in mips_modules.values() ])
19+
verilog = ''.join([ m.to_verilog() for m in mips_modules.values() if not m.used ])
2020
print(verilog)

tests/verilog/read_verilog_/branchpredunit/test_read_verilog_branchpredunit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@
537537
def test():
538538
veriloggen.reset()
539539
test_modules = read_verilog_branchpredunit.mkMips()
540-
code = ''.join([ m.to_verilog() for m in test_modules.values() ])
540+
code = ''.join([ m.to_verilog() for m in test_modules.values() if not m.used ])
541541

542542
from pyverilog.vparser.parser import parse
543543
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator

tests/verilog/read_verilog_/module_initial/read_verilog_module_initial.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@
1212
def mkLedTest():
1313
filename = os.path.dirname(os.path.abspath(__file__)) + '/led.v'
1414
modules = from_verilog.read_verilog_module(filename)
15-
led = modules['blinkled']
1615
test = modules['test']
17-
return led, test
16+
return test
1817

1918
if __name__ == '__main__':
20-
led, test = mkLedTest()
21-
verilog = ''.join([ test.to_verilog(), led.to_verilog() ])
19+
test = mkLedTest()
20+
verilog = test.to_verilog()
2221
print(verilog)

tests/verilog/read_verilog_/module_initial/test_read_verilog_module_initial.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@
8181

8282
def test():
8383
veriloggen.reset()
84-
test_module, test_bench = read_verilog_module_initial.mkLedTest()
85-
code = ''.join([ test_bench.to_verilog(), test_module.to_verilog() ])
84+
test_module = read_verilog_module_initial.mkLedTest()
85+
code = test_module.to_verilog()
8686
from pyverilog.vparser.parser import VerilogParser
8787
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
8888
parser = VerilogParser()

tests/verilog/read_verilog_/pycoram_object/read_verilog_pycoram_object.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ def mkUserlogic():
1717

1818
if __name__ == '__main__':
1919
modules = mkUserlogic()
20-
verilog = ''.join([ m.to_verilog() for m in modules.values() ])
20+
verilog = ''.join([ m.to_verilog() for m in modules.values() if not m.used ])
2121
print(verilog)

tests/verilog/read_verilog_/pycoram_object/test_read_verilog_pycoram_object.py

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,6 @@
44
import read_verilog_pycoram_object
55

66
expected_verilog = """
7-
module CoramMemory1P #
8-
(
9-
parameter CORAM_THREAD_NAME = "undefined",
10-
parameter CORAM_THREAD_ID = 0,
11-
parameter CORAM_ID = 0,
12-
parameter CORAM_SUB_ID = 0,
13-
parameter CORAM_ADDR_LEN = 10,
14-
parameter CORAM_DATA_WIDTH = 32
15-
)
16-
(
17-
input CLK,
18-
input [CORAM_ADDR_LEN - 1:0] ADDR,
19-
input [CORAM_DATA_WIDTH - 1:0] D,
20-
input WE,
21-
output [CORAM_DATA_WIDTH - 1:0] Q
22-
);
23-
24-
localparam CORAM_MEM_SIZE = (2 ** CORAM_ADDR_LEN);
25-
26-
endmodule
27-
287
module CoramMemoryBE1P #
298
(
309
parameter CORAM_THREAD_NAME = "undefined",
@@ -145,32 +124,6 @@
145124
146125
endmodule
147126
148-
module CoramChannel #
149-
(
150-
parameter CORAM_THREAD_NAME = "undefined",
151-
parameter CORAM_THREAD_ID = 0,
152-
parameter CORAM_ID = 0,
153-
parameter CORAM_SUB_ID = 0,
154-
parameter CORAM_ADDR_LEN = 4,
155-
parameter CORAM_DATA_WIDTH = 32
156-
)
157-
(
158-
input CLK,
159-
input RST,
160-
input [CORAM_DATA_WIDTH - 1:0] D,
161-
input ENQ,
162-
output FULL,
163-
output ALM_FULL,
164-
output [CORAM_DATA_WIDTH - 1:0] Q,
165-
input DEQ,
166-
output EMPTY,
167-
output ALM_EMPTY
168-
);
169-
170-
localparam CORAM_MEM_SIZE = (2 ** CORAM_ADDR_LEN);
171-
172-
endmodule
173-
174127
module CoramRegister #
175128
(
176129
parameter CORAM_THREAD_NAME = "undefined",
@@ -293,13 +246,60 @@
293246
.EMPTY(comm_empty)
294247
);
295248
249+
endmodule
250+
251+
module CoramMemory1P #
252+
(
253+
parameter CORAM_THREAD_NAME = "undefined",
254+
parameter CORAM_THREAD_ID = 0,
255+
parameter CORAM_ID = 0,
256+
parameter CORAM_SUB_ID = 0,
257+
parameter CORAM_ADDR_LEN = 10,
258+
parameter CORAM_DATA_WIDTH = 32
259+
)
260+
(
261+
input CLK,
262+
input [CORAM_ADDR_LEN - 1:0] ADDR,
263+
input [CORAM_DATA_WIDTH - 1:0] D,
264+
input WE,
265+
output [CORAM_DATA_WIDTH - 1:0] Q
266+
);
267+
268+
localparam CORAM_MEM_SIZE = (2 ** CORAM_ADDR_LEN);
269+
270+
endmodule
271+
272+
module CoramChannel #
273+
(
274+
parameter CORAM_THREAD_NAME = "undefined",
275+
parameter CORAM_THREAD_ID = 0,
276+
parameter CORAM_ID = 0,
277+
parameter CORAM_SUB_ID = 0,
278+
parameter CORAM_ADDR_LEN = 4,
279+
parameter CORAM_DATA_WIDTH = 32
280+
)
281+
(
282+
input CLK,
283+
input RST,
284+
input [CORAM_DATA_WIDTH - 1:0] D,
285+
input ENQ,
286+
output FULL,
287+
output ALM_FULL,
288+
output [CORAM_DATA_WIDTH - 1:0] Q,
289+
input DEQ,
290+
output EMPTY,
291+
output ALM_EMPTY
292+
);
293+
294+
localparam CORAM_MEM_SIZE = (2 ** CORAM_ADDR_LEN);
295+
296296
endmodule
297297
"""
298298

299299
def test():
300300
veriloggen.reset()
301301
modules = read_verilog_pycoram_object.mkUserlogic()
302-
code = ''.join([ m.to_verilog() for m in modules.values() ])
302+
code = ''.join([ m.to_verilog() for m in modules.values() if not m.used ])
303303

304304
from pyverilog.vparser.parser import VerilogParser
305305
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator

veriloggen/core/module.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def __init__(self, name=None, tmp_prefix='_tmp'):
3333
self.tmp_prefix = tmp_prefix
3434
self.tmp_count = 0
3535
self.hook = []
36+
self.used = False
3637

3738
#---------------------------------------------------------------------------
3839
# User interface for variables
@@ -798,6 +799,7 @@ def __init__(self, name=None, code=''):
798799
vtypes.VeriloggenNode.__init__(self)
799800
self.name = name if name is not None else self.__class__.__name__
800801
self.code = code
802+
self.used = False
801803

802804
def set_code(self, code):
803805
self.code = code
@@ -833,6 +835,8 @@ def __init__(self, module, instname, params=None, ports=None):
833835
self._type_check_ports(ports)
834836
self.module = module
835837
self.instname = instname
838+
if hasattr(self.module, 'used'):
839+
self.module.used = True
836840

837841
if not params:
838842
self.params = ()

veriloggen/verilog/from_verilog.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ def read_verilog_stubmodule(*filelist, **opt):
3131

3232
def read_verilog_module(*filelist, **opt):
3333
module_dict = to_module_dict(*filelist, **opt)
34-
visitor = VerilogReadVisitor()
35-
modules = collections.OrderedDict([ (name, visitor.visit(m) )
36-
for name, m in module_dict.items() ])
34+
visitor = VerilogReadVisitor(module_dict)
35+
for name, m in module_dict.items():
36+
visitor.visit(m)
37+
modules = visitor.converted_modules
3738
return modules
3839

3940
def read_verilog_module_str(code, encode='utf-8'):
@@ -101,10 +102,25 @@ def __getattr__(self, attr):
101102

102103
#-------------------------------------------------------------------------------
103104
class VerilogReadVisitor(object):
104-
def __init__(self):
105+
def __init__(self, ast_module_dict, converted_modules=None):
106+
self.ast_module_dict = ast_module_dict
107+
self.converted_modules = (collections.OrderedDict()
108+
if converted_modules is None
109+
else converted_modules)
105110
self.m = None
106111
self.module_stack = []
107112

113+
def get_module(self, name):
114+
if name in self.converted_modules:
115+
return self.converted_modules[name]
116+
if name not in self.ast_module_dict:
117+
return StubModule(name)
118+
visitor = VerilogReadVisitor(self.ast_module_dict, self.converted_modules)
119+
mod = visitor.visit(self.ast_module_dict[name])
120+
self.converted_modules[name] = mod
121+
self.converted_modules.update(visitor.converted_modules)
122+
return mod
123+
108124
def push_module(self, m):
109125
self.module_stack.append(self.m)
110126
self.m = m
@@ -132,11 +148,17 @@ def visit(self, node):
132148
return visitor(node)
133149

134150
def visit_ModuleDef(self, node):
151+
# check module cache
152+
if node.name in self.converted_modules:
153+
return self.converted_modules[node.name]
154+
135155
# create new Verilog module
136156
m = module.Module(node.name)
137157
self.push_module(m)
138158
self.generic_visit(node)
139159
self.pop_module()
160+
161+
self.converted_modules[node.name] = m
140162
return m
141163

142164
def visit_Paramlist(self, node):
@@ -684,7 +706,7 @@ def visit_InstanceList(self, node):
684706
return [ self.visit(instance) for instance in node.instances ]
685707

686708
def visit_Instance(self, node):
687-
m = module.StubModule(node.module)
709+
m = self.get_module(node.module)
688710
instname = node.name
689711
params = [ self.visit(param) for param in node.parameterlist ]
690712
ports = [ self.visit(port) for port in node.portlist ]

0 commit comments

Comments
 (0)