Skip to content

Commit 3f7ad12

Browse files
committed
main parts of pyverilog modules are moved to examples.
1 parent 16c8fe4 commit 3f7ad12

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1273
-1130
lines changed

examples/Makefile

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
PYTHON=python3
2+
#PYTHON=python
3+
#OPT=-m pdb
4+
#OPT=-m cProfile -s time
5+
#OPT=-m cProfile -o profile.rslt
6+
7+
PREPROCESSOR=example_preprocessor.py
8+
LEXER=example_lexer.py
9+
PARSER=example_parser.py
10+
11+
DATAFLOW=example_dataflow_analyzer.py
12+
OPTIMIZER=example_optimizer.py
13+
MERGE=example_merge.py
14+
WALKER=example_walker.py
15+
SUBSET=example_subset.py
16+
DFCODEGEN=example_dataflow_codegen.py
17+
GRAPHGEN=example_graphgen.py
18+
19+
CONTROLFLOW=example_controlflow_analyzer.py
20+
ACTIVE=example_active_analyzer.py
21+
ACTIVERANGE=example_active_range.py
22+
23+
CODEGEN=example_codegen.py
24+
25+
SRCS=../verilogcode/vectoradd.v
26+
TOP=-t TOP
27+
TARGETS=-s "TOP.MEM_A"
28+
29+
CODEGEN_OUT=out.v
30+
CODEGEN_OPT=-o $(CODEGEN_OUT)
31+
GRAPHGEN_OUT=out.png
32+
GRAPHGEN_OPT=--identical --walk --step=0 -o $(GRAPHGEN_OUT)
33+
34+
NOGRAPH=--nograph
35+
NOLABEL=--nolabel
36+
CONTROLFLOW_OPT=$(NOGRAPH) $(NOLABEL)
37+
38+
.PHONY: all
39+
all: preprocess lex parse dataflow optimize merge walk subset dfcodegen \
40+
controlflow active activerange codegen
41+
42+
.PHONY: preprocess
43+
preprocess:
44+
$(PYTHON) $(OPT) $(PREPROCESSOR) $(SRCS)
45+
46+
.PHONY: lex
47+
lex:
48+
$(PYTHON) $(OPT) $(LEXER) $(SRCS)
49+
50+
.PHONY: parse
51+
parse:
52+
$(PYTHON) $(OPT) $(PARSER) $(SRCS)
53+
54+
.PHONY: dataflow
55+
dataflow:
56+
$(PYTHON) $(OPT) $(DATAFLOW) $(SRCS) $(TOP)
57+
58+
.PHONY: optimize
59+
optimize:
60+
$(PYTHON) $(OPT) $(OPTIMIZER) $(SRCS) $(TOP)
61+
62+
.PHONY: merge
63+
merge:
64+
$(PYTHON) $(OPT) $(MERGE) $(SRCS) $(TOP) $(TARGETS)
65+
66+
.PHONY: walk
67+
walk:
68+
$(PYTHON) $(OPT) $(WALKER) $(SRCS) $(TOP) $(TARGETS)
69+
70+
.PHONY: subset
71+
subset:
72+
$(PYTHON) $(OPT) $(SUBSET) $(SRCS) $(TOP) $(TARGETS)
73+
74+
.PHONY: dfcodegen
75+
dfcodegen:
76+
$(PYTHON) $(OPT) $(DFCODEGEN) $(SRCS) $(TOP) $(TARGETS) $(CODEGEN_OPT)
77+
78+
.PHONY: graphgen
79+
graphgen:
80+
$(PYTHON) $(OPT) $(GRAPHGEN) $(SRCS) $(TOP) $(TARGETS) $(GRAPHGEN_OPT)
81+
82+
.PHONY: controlflow
83+
controlflow:
84+
$(PYTHON) $(OPT) $(CONTROLFLOW) $(SRCS) $(TOP) $(TARGETS) $(CONTROLFLOW_OPT)
85+
86+
.PHONY: active
87+
active:
88+
$(PYTHON) $(OPT) $(ACTIVE) $(TOP) $(SRCS) $(TARGETS)
89+
90+
.PHONY: activerange
91+
activerange:
92+
$(PYTHON) $(OPT) $(ACTIVERANGE) $(TOP) $(SRCS) $(TARGETS)
93+
94+
.PHONY: codegen
95+
codegen:
96+
$(PYTHON) $(OPT) $(CODEGEN) $(SRCS)
97+
98+
.PHONY: clean
99+
clean:
100+
rm -rf *.pyc __pycache__ parsetab.py *.out *.png *.v *.dot
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
from optparse import OptionParser
6+
7+
# the next line can be removed after installation
8+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9+
10+
import pyverilog.utils.version
11+
import pyverilog.utils.util as util
12+
import pyverilog.controlflow.splitter as splitter
13+
from pyverilog.dataflow.dataflow_analyzer import VerilogDataflowAnalyzer
14+
from pyverilog.dataflow.optimizer import VerilogDataflowOptimizer
15+
from pyverilog.controlflow.active_analyzer import VerilogActiveConditionAnalyzer
16+
17+
def main():
18+
INFO = "Active condition analyzer"
19+
VERSION = pyverilog.utils.version.VERSION
20+
USAGE = "Usage: python active_analyzer.py -t TOPMODULE file ..."
21+
22+
def showVersion():
23+
print(INFO)
24+
print(VERSION)
25+
print(USAGE)
26+
sys.exit()
27+
28+
optparser = OptionParser()
29+
optparser.add_option("-v","--version",action="store_true",dest="showversion",
30+
default=False,help="Show the version")
31+
optparser.add_option("-t","--top",dest="topmodule",
32+
default="TOP",help="Top module, Default=TOP")
33+
optparser.add_option("-s","--search",dest="searchtarget",action="append",
34+
default=[],help="Search Target Signal")
35+
(options, args) = optparser.parse_args()
36+
37+
filelist = args
38+
if options.showversion:
39+
showVersion()
40+
41+
for f in filelist:
42+
if not os.path.exists(f): raise IOError("file not found: " + f)
43+
44+
if len(filelist) == 0:
45+
showVersion()
46+
47+
analyzer = VerilogDataflowAnalyzer(filelist, options.topmodule)
48+
analyzer.generate()
49+
50+
directives = analyzer.get_directives()
51+
terms = analyzer.getTerms()
52+
binddict = analyzer.getBinddict()
53+
54+
optimizer = VerilogDataflowOptimizer(terms, binddict)
55+
56+
optimizer.resolveConstant()
57+
resolved_terms = optimizer.getResolvedTerms()
58+
resolved_binddict = optimizer.getResolvedBinddict()
59+
constlist = optimizer.getConstlist()
60+
61+
canalyzer = VerilogActiveConditionAnalyzer(options.topmodule, terms, binddict,
62+
resolved_terms, resolved_binddict, constlist)
63+
64+
for target in options.searchtarget:
65+
signal = util.toTermname(target)
66+
67+
active_conditions = canalyzer.getActiveConditions( signal )
68+
#active_conditions = canalyzer.getActiveConditions( signal, condition=splitter.active_modify )
69+
#active_conditions = canalyzer.getActiveConditions( signal, condition=splitter.active_unmodify )
70+
71+
print('Active Cases: %s' % signal)
72+
for fsm_sig, active_conditions in sorted(active_conditions.items(), key=lambda x:str(x[0])):
73+
print('FSM: %s' % fsm_sig)
74+
for state, active_condition in sorted(active_conditions, key=lambda x:str(x[0])):
75+
s = []
76+
s.append('state: %d -> ' % state)
77+
if active_condition: s.append(active_condition.tocode())
78+
else: s.append('empty')
79+
print(''.join(s))
80+
81+
if __name__ == '__main__':
82+
main()

examples/example_active_range.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
from optparse import OptionParser
6+
7+
# the next line can be removed after installation
8+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9+
10+
import pyverilog.utils.version
11+
import pyverilog.utils.util as util
12+
from pyverilog.dataflow.dataflow_analyzer import VerilogDataflowAnalyzer
13+
from pyverilog.dataflow.optimizer import VerilogDataflowOptimizer
14+
from pyverilog.controlflow.active_range import VerilogActiveAnalyzer
15+
16+
def main():
17+
INFO = "Active condition analyzer (Obsoluted)"
18+
VERSION = pyverilog.utils.version.VERSION
19+
USAGE = "Usage: python active_range.py -t TOPMODULE file ..."
20+
21+
def showVersion():
22+
print(INFO)
23+
print(VERSION)
24+
print(USAGE)
25+
sys.exit()
26+
27+
optparser = OptionParser()
28+
optparser.add_option("-v","--version",action="store_true",dest="showversion",
29+
default=False,help="Show the version")
30+
optparser.add_option("-t","--top",dest="topmodule",
31+
default="TOP",help="Top module, Default=TOP")
32+
optparser.add_option("-s","--search",dest="searchtarget",action="append",
33+
default=[],help="Search Target Signal")
34+
(options, args) = optparser.parse_args()
35+
36+
filelist = args
37+
if options.showversion:
38+
showVersion()
39+
40+
for f in filelist:
41+
if not os.path.exists(f): raise IOError("file not found: " + f)
42+
43+
if len(filelist) == 0:
44+
showVersion()
45+
46+
analyzer = VerilogDataflowAnalyzer(filelist, options.topmodule)
47+
analyzer.generate()
48+
49+
directives = analyzer.get_directives()
50+
terms = analyzer.getTerms()
51+
binddict = analyzer.getBinddict()
52+
53+
optimizer = VerilogDataflowOptimizer(terms, binddict)
54+
55+
optimizer.resolveConstant()
56+
resolved_terms = optimizer.getResolvedTerms()
57+
resolved_binddict = optimizer.getResolvedBinddict()
58+
constlist = optimizer.getConstlist()
59+
60+
aanalyzer = VerilogActiveAnalyzer(options.topmodule, terms, binddict,
61+
resolved_terms, resolved_binddict, constlist)
62+
63+
for target in options.searchtarget:
64+
signal = util.toTermname(target)
65+
66+
print('Active Conditions: %s' % signal)
67+
active_conditions = aanalyzer.getActiveConditions( signal )
68+
print(sorted(active_conditions, key=lambda x:str(x)))
69+
70+
print('Changed Conditions')
71+
changed_conditions = aanalyzer.getChangedConditions( signal )
72+
print(sorted(changed_conditions, key=lambda x:str(x)))
73+
74+
print('Changed Condition Dict')
75+
changed_conditiondict = aanalyzer.getChangedConditionsWithAssignments( signal )
76+
print(sorted(changed_conditiondict.items(), key=lambda x:str(x[0])))
77+
78+
print('Unchanged Conditions')
79+
unchanged_conditions = aanalyzer.getUnchangedConditions( signal )
80+
print(sorted(unchanged_conditions, key=lambda x:str(x)))
81+
82+
if __name__ == '__main__':
83+
main()

examples/example_ast_code.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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.abspath(__file__))))
8+
9+
import pyverilog.vparser.ast as vast
10+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
11+
12+
def main():
13+
params = vast.Paramlist(())
14+
clk = vast.Ioport( vast.Input('CLK') )
15+
rst = vast.Ioport( vast.Input('RST') )
16+
width = vast.Width( vast.IntConst('7'), vast.IntConst('0') )
17+
led = vast.Ioport( vast.Output('led', width=width) )
18+
ports = vast.Portlist( (clk, rst, led) )
19+
items = ( vast.Assign( vast.Identifier('led'), vast.IntConst('8') ) ,)
20+
ast = vast.ModuleDef("top", params, ports, items)
21+
22+
codegen = ASTCodeGenerator()
23+
rslt = codegen.visit(ast)
24+
print(rslt)
25+
26+
if __name__ == '__main__':
27+
main()

examples/example_codegen.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
from optparse import OptionParser
6+
7+
# the next line can be removed after installation
8+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9+
10+
import pyverilog.utils.version
11+
from pyverilog.vparser.parser import VerilogCodeParser
12+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
13+
14+
def main():
15+
INFO = "Code converter from AST"
16+
VERSION = pyverilog.utils.version.VERSION
17+
USAGE = "Usage: python codegen.py file ..."
18+
19+
def showVersion():
20+
print(INFO)
21+
print(VERSION)
22+
print(USAGE)
23+
sys.exit()
24+
25+
optparser = OptionParser()
26+
optparser.add_option("-v","--version",action="store_true",dest="showversion",
27+
default=False,help="Show the version")
28+
optparser.add_option("-I","--include",dest="include",action="append",
29+
default=[],help="Include path")
30+
optparser.add_option("-D",dest="define",action="append",
31+
default=[],help="Macro Definition")
32+
(options, args) = optparser.parse_args()
33+
34+
filelist = args
35+
if options.showversion:
36+
showVersion()
37+
38+
for f in filelist:
39+
if not os.path.exists(f): raise IOError("file not found: " + f)
40+
41+
if len(filelist) == 0:
42+
showVersion()
43+
44+
codeparser = VerilogCodeParser(filelist,
45+
preprocess_include=options.include,
46+
preprocess_define=options.define)
47+
48+
ast = codeparser.parse()
49+
directives = codeparser.get_directives()
50+
51+
codegen = ASTCodeGenerator()
52+
rslt = codegen.visit(ast)
53+
print(rslt)
54+
55+
if __name__ == '__main__':
56+
main()

0 commit comments

Comments
 (0)