mirror of
https://github.com/verilator/verilator.git
synced 2026-10-06 01:54:01 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
470f12ff46 | ||
|
|
4422de0c6c | ||
|
|
8a708f52f7 | ||
|
|
bcefc17631 | ||
|
|
daf19e241e | ||
|
|
b5f5b1fdf9 | ||
|
|
801b718953 | ||
|
|
f571658aa4 | ||
|
|
5d233b8c09 | ||
|
|
00724597f4 | ||
|
|
c659940ea8 | ||
|
|
23539eb55c | ||
|
|
e69bf418de | ||
|
|
0e1fcd38bb | ||
|
|
e74186565d | ||
|
|
7e54281e26 | ||
|
|
15f512bdee | ||
|
|
ecfe0283e2 | ||
|
|
3b874f759c | ||
|
|
9c9b4ed4e0 | ||
|
|
4f6d80c602 | ||
|
|
b50542531d | ||
|
|
8ab28d1d12 | ||
|
|
9567da22f8 | ||
|
|
36814b7681 | ||
|
|
82235e6c6f | ||
|
|
a8310f35f2 | ||
|
|
85989af031 | ||
|
|
cf9ffd16dd | ||
|
|
0602537cce | ||
|
|
24e32420b7 | ||
|
|
39c494260b | ||
|
|
761b9c9290 | ||
|
|
27686d8c2f | ||
|
|
d2b007005d | ||
|
|
f1ef30a5bb | ||
|
|
f1d9437c55 | ||
|
|
bcba5075e8 | ||
|
|
d6e8b0263c | ||
|
|
9aba617bad | ||
|
|
c24f7b1391 | ||
|
|
d4e27b635f | ||
|
|
c996d2870c | ||
|
|
bbd59f8a22 | ||
|
|
d3d359e757 | ||
|
|
ae763ea93d | ||
|
|
236b9e9761 | ||
|
|
e42c9dfd84 | ||
|
|
bebf5b291b | ||
|
|
1e3dcd203d | ||
|
|
cc7da63dec | ||
|
|
1baa2a2558 | ||
|
|
e63ff77b15 | ||
|
|
6cf9468477 | ||
|
|
b277bc8750 | ||
|
|
ba9da64207 | ||
|
|
9cb9f9c80b | ||
|
|
7a65df7636 | ||
|
|
eab46d547d | ||
|
|
3dd552c4a2 | ||
|
|
23bb045a72 | ||
|
|
7c834ad118 | ||
|
|
8e2617ab8d | ||
|
|
24fcae4f49 | ||
|
|
ce18674d88 | ||
|
|
6b8d9b5c36 | ||
|
|
81bf95763c | ||
|
|
2d64077fd0 | ||
|
|
38faebcf20 | ||
|
|
48d177a9d0 | ||
|
|
3b3a7f7354 | ||
|
|
99cd2818a1 | ||
|
|
5765e099a6 | ||
|
|
175d59ecba | ||
|
|
3bd3d01968 | ||
|
|
85e2a6bb45 | ||
|
|
84efd239a5 | ||
|
|
6a69813326 | ||
|
|
2c9dcc3913 | ||
|
|
20ea1ca018 | ||
|
|
0abde90933 | ||
|
|
e01b69198a | ||
|
|
53cd9d2403 | ||
|
|
3d0f5fc078 | ||
|
|
54eedcc739 | ||
|
|
ae6f5844da | ||
|
|
1bea845ceb | ||
|
|
d581582339 | ||
|
|
4eabc1992e | ||
|
|
316eb24bbb | ||
|
|
f0a8824efc | ||
|
|
345a5d5646 | ||
|
|
464679c78b | ||
|
|
28eeec1cf4 | ||
|
|
7d0dce3267 | ||
|
|
9e29625207 | ||
|
|
a767da4f3f | ||
|
|
7bd96c2876 | ||
|
|
70fd64dcd6 | ||
|
|
bb2822f4b5 | ||
|
|
ad21108b63 | ||
|
|
e6808a787c | ||
|
|
1fb2762725 | ||
|
|
cce55941d3 | ||
|
|
6c8d95e0e2 | ||
|
|
216a178b28 | ||
|
|
6594a54a95 | ||
|
|
a9a4cf061a | ||
|
|
b7f0e204cb | ||
|
|
e6a15f233b | ||
|
|
e0edb596ea | ||
|
|
f2fb77c15a | ||
|
|
772a3a97eb | ||
|
|
6c310836a1 | ||
|
|
75416a3016 | ||
|
|
ebef78a13e | ||
|
|
e71baca39b | ||
|
|
18eb210313 | ||
|
|
7d38a5e1f9 | ||
|
|
4386077e2d | ||
|
|
49dbfd2131 | ||
|
|
a80fce5ac1 | ||
|
|
891b981cab | ||
|
|
2dd87b8384 | ||
|
|
062eb85075 | ||
|
|
e1f6802f5f | ||
|
|
6cfcd50f12 |
@@ -3,6 +3,141 @@ Revision history for Verilator
|
|||||||
The contributors that suggested a given feature are shown in []. [by ...]
|
The contributors that suggested a given feature are shown in []. [by ...]
|
||||||
indicates the contributor was also the author of the fix; Thanks!
|
indicates the contributor was also the author of the fix; Thanks!
|
||||||
|
|
||||||
|
* Verilator 3.855 2014-01-18
|
||||||
|
|
||||||
|
*** Support modport import, bug696. [Jeremy Bennett]
|
||||||
|
|
||||||
|
*** Add --trace-structs to show struct names, bug673. [Chris Randall]
|
||||||
|
|
||||||
|
**** Fix tracing of packed structs, bug705. [Jie Xu]
|
||||||
|
|
||||||
|
**** Fix --lint-only with MinGW, msg1283. [HyungKi Jeong]
|
||||||
|
|
||||||
|
**** Fix some delayed assignments of typedefed unpacked arrays.
|
||||||
|
|
||||||
|
**** Fix wire declarations with size and not range, bug466. [Alex Solomatnikov]
|
||||||
|
|
||||||
|
**** Fix parameter pin vs. normal pin error, bug704. [Alex Solomatnikov]
|
||||||
|
|
||||||
|
|
||||||
|
* Verilator 3.854 2013-11-26
|
||||||
|
|
||||||
|
*** Add UNPACKED warning to convert unpacked structs. [Jeremy Bennett]
|
||||||
|
|
||||||
|
*** Add --compiler clang to work around compiler bug, bug694. [Stefan Ludwig]
|
||||||
|
|
||||||
|
**** Support vpi_get of vpiSuppressVal, bug687. [Varun Koyyalagunta]
|
||||||
|
|
||||||
|
**** Support vpi_get_time, bug688. [Varun Koyyalagunta]
|
||||||
|
|
||||||
|
**** Fix evaluation of chained parameter functions, bug684. [Ted Campbell]
|
||||||
|
|
||||||
|
**** Fix enum value extension of '1.
|
||||||
|
|
||||||
|
**** Fix multiple VPI variable callbacks, bug679. [Rich Porter]
|
||||||
|
|
||||||
|
**** Fix vpi_get of vpiSize, bug680. [Rich Porter]
|
||||||
|
|
||||||
|
**** Fix vpi_remove_cb inside callback, bug689. [Varun Koyyalagunta]
|
||||||
|
|
||||||
|
**** Fix crash with coverage of structures, bug691. [Eivind Liland]
|
||||||
|
|
||||||
|
**** Fix array assignment from const var, bug693. [Jie Xu]
|
||||||
|
|
||||||
|
|
||||||
|
* Verilator 3.853 2013-09-30
|
||||||
|
|
||||||
|
**** Add --no-order-clock-delay to work around bug613. [Charlie Brej]
|
||||||
|
|
||||||
|
|
||||||
|
* Verilator 3.852 2013-09-29
|
||||||
|
|
||||||
|
*** Support named function and task arguments. [Chris Randall]
|
||||||
|
|
||||||
|
*** Report SELRANGE warning for non-generate if, bug675. [Roland Kruse]
|
||||||
|
|
||||||
|
**** Fix ordering of $fgetc, msg1229. [Frederic Requin]
|
||||||
|
|
||||||
|
**** Fix --output-split-cfunc to count internal functions. [Chris Randall]
|
||||||
|
|
||||||
|
**** Fix crash on 32-bit Ubuntu, bug670. [Mark Jackson Pulver]
|
||||||
|
|
||||||
|
|
||||||
|
* Verilator 3.851 2013-08-15
|
||||||
|
|
||||||
|
*** Fix ordering of clock enables with delayed assigns, bug613. [Jeremy Bennett]
|
||||||
|
|
||||||
|
*** Fix vpi_iterate on memory words, bug655. [Rich Porter]
|
||||||
|
|
||||||
|
**** Fix final duplicate declarations when non-inlined, bug661. [Charlie Brej]
|
||||||
|
|
||||||
|
**** Fix interface ports with comma lists, msg1058. [Ed Lander]
|
||||||
|
|
||||||
|
**** Fix parameter real conversion from integer.
|
||||||
|
|
||||||
|
**** Fix clang warnings, bug668. [Yutetsu Takatsukasa]
|
||||||
|
|
||||||
|
|
||||||
|
* Verilator 3.850 2013-06-02
|
||||||
|
|
||||||
|
** Support interfaces and modports, bug102. [Byron Bradley, Jeremy Bennett]
|
||||||
|
|
||||||
|
*** Duplicate clock gate optimization on by default, bug621.
|
||||||
|
|
||||||
|
**** Fix arrayed input compile error, bug645. [Krzysztof Jankowski]
|
||||||
|
|
||||||
|
**** Fix GCC version runtime changes, bug651. [Jeremy Bennett]
|
||||||
|
|
||||||
|
**** Fix packed array select internal error, bug652. [Krzysztof Jankowski]
|
||||||
|
|
||||||
|
|
||||||
|
* Verilator 3.847 2013-05-11
|
||||||
|
|
||||||
|
*** Add ALWCOMBORDER warning. [KC Buckenmaier]
|
||||||
|
|
||||||
|
*** Add --pins-sc-uint and --pins-sc-biguint, bug638. [Alex Hornung]
|
||||||
|
|
||||||
|
**** Support "signal[vec]++".
|
||||||
|
|
||||||
|
**** Fix simulation error when inputs and MULTIDRIVEN, bug634. [Ted Campbell]
|
||||||
|
|
||||||
|
**** Fix module resolution with __, bug631. [Jason McMullan]
|
||||||
|
|
||||||
|
**** Fix packed array non-zero right index select crash, bug642. [Krzysztof Jankowski]
|
||||||
|
|
||||||
|
**** Fix nested union crash, bug643. [Krzysztof Jankowski]
|
||||||
|
|
||||||
|
|
||||||
|
* Verilator 3.846 2013-03-09
|
||||||
|
|
||||||
|
** IEEE 1800-2012 is now the default language. This adds 4 new keywords
|
||||||
|
and updates the svdpi.h and vpi_user.h header files.
|
||||||
|
|
||||||
|
*** Add --report-unoptflat, bug611. [Jeremy Bennett]
|
||||||
|
|
||||||
|
*** Add duplicate clock gate optimization, msg980. [Varun Koyyalagunta]
|
||||||
|
Disabled unless -OD or -O3 used, please try it as may get some
|
||||||
|
significant speedups.
|
||||||
|
|
||||||
|
*** Fix wrong dot resolution under inlining. [Art Stamness]
|
||||||
|
|
||||||
|
**** Support pattern assignment features, bug616, bug617, bug618. [Ed Lander]
|
||||||
|
|
||||||
|
**** Support bind in $unit, bug602. [Ed Lander]
|
||||||
|
|
||||||
|
**** Support <number>'() sized casts, bug628. [Ed Lander]
|
||||||
|
|
||||||
|
**** Fix DETECTARRAY on packed structures, bug610. [Jeremy Bennett]
|
||||||
|
|
||||||
|
**** Fix LITENDIAN on unpacked structures, bug614. [Wai Sum Mong]
|
||||||
|
|
||||||
|
**** Fix 32-bit OS VPI scan issue, bug615. [Jeremy Bennett, Rich Porter]
|
||||||
|
|
||||||
|
**** Fix opening a VerilatedVcdC file multiple times, msg1021. [Frederic Requin]
|
||||||
|
|
||||||
|
**** Fix UNOPTFLAT circular array bounds crossing, bug630. [Jie Xu]
|
||||||
|
|
||||||
|
|
||||||
* Verilator 3.845 2013/02/04
|
* Verilator 3.845 2013/02/04
|
||||||
|
|
||||||
*** Fix nested packed arrays and struct, bug600. [Jeremy Bennett]
|
*** Fix nested packed arrays and struct, bug600. [Jeremy Bennett]
|
||||||
@@ -2185,7 +2320,7 @@ of input ports exists for tracing.
|
|||||||
|
|
||||||
This uses outline mode in Emacs. See C-h m [M-x describe-mode].
|
This uses outline mode in Emacs. See C-h m [M-x describe-mode].
|
||||||
|
|
||||||
Copyright 2001-2013 by Wilson Snyder. This program is free software; you
|
Copyright 2001-2014 by Wilson Snyder. This program is free software; you
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
can redistribute it and/or modify it under the terms of either the GNU
|
||||||
Lesser General Public License Version 3 or the Perl Artistic License
|
Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
Version 2.0.
|
Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,5 @@
|
|||||||
^CVS/
|
^CVS/
|
||||||
/CVS/
|
/CVS/
|
||||||
\.gdbinit$
|
|
||||||
\.git/
|
\.git/
|
||||||
\.svn/
|
\.svn/
|
||||||
\.(bak|old)/
|
\.(bak|old)/
|
||||||
@@ -23,6 +22,7 @@
|
|||||||
src/Makefile$
|
src/Makefile$
|
||||||
src/Makefile_obj$
|
src/Makefile_obj$
|
||||||
include/verilated.mk$
|
include/verilated.mk$
|
||||||
|
test_regress/.gdbinit$
|
||||||
config.cache$
|
config.cache$
|
||||||
config.status$
|
config.status$
|
||||||
verilator.log
|
verilator.log
|
||||||
|
|||||||
+2
-1
@@ -9,7 +9,7 @@
|
|||||||
#
|
#
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
#
|
#
|
||||||
# Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
# Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
@@ -121,6 +121,7 @@ DISTFILES_INC = $(INFOS) .gitignore Artistic COPYING COPYING.LESSER \
|
|||||||
include/vltstd/*.[chv]* \
|
include/vltstd/*.[chv]* \
|
||||||
.*attributes */.*attributes */*/.*attributes \
|
.*attributes */.*attributes */*/.*attributes \
|
||||||
src/.*ignore src/*.in src/*.cpp src/*.[chly] src/astgen src/bisonpre src/*fix \
|
src/.*ignore src/*.in src/*.cpp src/*.[chly] src/astgen src/bisonpre src/*fix \
|
||||||
|
src/.gdbinit \
|
||||||
src/*.pl src/*.pod \
|
src/*.pl src/*.pod \
|
||||||
test_*/.*ignore test_*/Makefile* test_*/*.cpp \
|
test_*/.*ignore test_*/Makefile* test_*/*.cpp \
|
||||||
test_*/*.pl test_*/*.v test_*/*.vc test_*/*.vh \
|
test_*/*.pl test_*/*.v test_*/*.vc test_*/*.vh \
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// DESCRIPTION: Verilator: List of To Do issues.
|
// DESCRIPTION: Verilator: List of To Do issues.
|
||||||
//
|
//
|
||||||
// Copyright 2004-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2004-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+127
-27
@@ -3,7 +3,7 @@ eval 'exec perl -wS $0 ${1+"$@"}'
|
|||||||
if 0;
|
if 0;
|
||||||
######################################################################
|
######################################################################
|
||||||
#
|
#
|
||||||
# Copyright 2003-2013 by Wilson Snyder. This program is free software; you
|
# Copyright 2003-2014 by Wilson Snyder. This program is free software; you
|
||||||
# can redistribute it and/or modify it under the terms of either the GNU
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
@@ -245,6 +245,7 @@ descriptions in the next sections for more information.
|
|||||||
+1364-2005ext+<ext> Use Verilog 2005 with file extension <ext>
|
+1364-2005ext+<ext> Use Verilog 2005 with file extension <ext>
|
||||||
+1800-2005ext+<ext> Use SystemVerilog 2005 with file extension <ext>
|
+1800-2005ext+<ext> Use SystemVerilog 2005 with file extension <ext>
|
||||||
+1800-2009ext+<ext> Use SystemVerilog 2009 with file extension <ext>
|
+1800-2009ext+<ext> Use SystemVerilog 2009 with file extension <ext>
|
||||||
|
+1800-2012ext+<ext> Use SystemVerilog 2012 with file extension <ext>
|
||||||
--assert Enable all assertions
|
--assert Enable all assertions
|
||||||
--autoflush Flush streams after all $displays
|
--autoflush Flush streams after all $displays
|
||||||
--bbox-sys Blackbox unknown $system calls
|
--bbox-sys Blackbox unknown $system calls
|
||||||
@@ -298,9 +299,13 @@ descriptions in the next sections for more information.
|
|||||||
-O3 High performance optimizations
|
-O3 High performance optimizations
|
||||||
-O<optimization-letter> Selectable optimizations
|
-O<optimization-letter> Selectable optimizations
|
||||||
-o <executable> Name of final executable
|
-o <executable> Name of final executable
|
||||||
|
--no-order-clock-delay Disable ordering clock enable assignments
|
||||||
--output-split <bytes> Split .cpp files into pieces
|
--output-split <bytes> Split .cpp files into pieces
|
||||||
--output-split-cfuncs <statements> Split .ccp functions
|
--output-split-cfuncs <statements> Split .cpp functions
|
||||||
|
--output-split-ctrace <statements> Split tracing functions
|
||||||
--pins-bv <bits> Specify types for top level ports
|
--pins-bv <bits> Specify types for top level ports
|
||||||
|
--pins-sc-uint Specify types for top level ports
|
||||||
|
--pins-sc-biguint Specify types for top level ports
|
||||||
--pins-uint8 Specify types for top level ports
|
--pins-uint8 Specify types for top level ports
|
||||||
--pipe-filter <command> Filter all input through a script
|
--pipe-filter <command> Filter all input through a script
|
||||||
--prefix <topname> Name of top level class
|
--prefix <topname> Name of top level class
|
||||||
@@ -308,17 +313,19 @@ descriptions in the next sections for more information.
|
|||||||
--private Debugging; see docs
|
--private Debugging; see docs
|
||||||
--psl Enable PSL parsing
|
--psl Enable PSL parsing
|
||||||
--public Debugging; see docs
|
--public Debugging; see docs
|
||||||
|
--report-unoptflat Extra diagnostics for UNOPTFLAT
|
||||||
--savable Enable model save-restore
|
--savable Enable model save-restore
|
||||||
--sc Create SystemC output
|
--sc Create SystemC output
|
||||||
--sp Create SystemPerl output
|
--sp Create SystemPerl output
|
||||||
--stats Create statistics file
|
--stats Create statistics file
|
||||||
-sv Enable SystemVerilog parsing
|
-sv Enable SystemVerilog parsing
|
||||||
+systemverilogext+<ext> Synonym for +1800-2009ext+<ext>
|
+systemverilogext+<ext> Synonym for +1800-2012ext+<ext>
|
||||||
--top-module <topname> Name of top level input module
|
--top-module <topname> Name of top level input module
|
||||||
--trace Enable waveform creation
|
--trace Enable waveform creation
|
||||||
--trace-depth <levels> Depth of tracing
|
--trace-depth <levels> Depth of tracing
|
||||||
--trace-max-array <depth> Maximum bit width for tracing
|
--trace-max-array <depth> Maximum bit width for tracing
|
||||||
--trace-max-width <width> Maximum array depth for tracing
|
--trace-max-width <width> Maximum array depth for tracing
|
||||||
|
--trace-structs Enable tracing structure names
|
||||||
--trace-underscore Enable tracing of _signals
|
--trace-underscore Enable tracing of _signals
|
||||||
-U<var> Undefine preprocessor define
|
-U<var> Undefine preprocessor define
|
||||||
--unroll-count <loops> Tune maximum loop iterations
|
--unroll-count <loops> Tune maximum loop iterations
|
||||||
@@ -373,6 +380,8 @@ with the --exe option.
|
|||||||
|
|
||||||
=item +1800-2009ext+I<ext>
|
=item +1800-2009ext+I<ext>
|
||||||
|
|
||||||
|
=item +1800-2012ext+I<ext>
|
||||||
|
|
||||||
Specifies the language standard to be used with a specific filename
|
Specifies the language standard to be used with a specific filename
|
||||||
extension, I<ext>.
|
extension, I<ext>.
|
||||||
|
|
||||||
@@ -461,6 +470,12 @@ Enables tunings and work-arounds for the specified C++ compiler.
|
|||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
|
=item clang
|
||||||
|
|
||||||
|
Tune for clang. This may reduce execution speed as it enables several
|
||||||
|
workarounds to avoid silly hardcoded limits in clang. This includes
|
||||||
|
breaking deep structures as for msvc as described below.
|
||||||
|
|
||||||
=item gcc
|
=item gcc
|
||||||
|
|
||||||
Tune for Gnu C++, although generated code should work on almost any
|
Tune for Gnu C++, although generated code should work on almost any
|
||||||
@@ -584,7 +599,7 @@ C<--debug> is equivalent to C<--debugi 4>).
|
|||||||
|
|
||||||
Select the language to be used by default when first processing each
|
Select the language to be used by default when first processing each
|
||||||
Verilog file. The language value must be "1364-1995", "1364-2001",
|
Verilog file. The language value must be "1364-1995", "1364-2001",
|
||||||
"1364-2005", "1800-2005" or "1800-2009".
|
"1364-2005", "1800-2005", "1800-2009" or "1800-2012".
|
||||||
|
|
||||||
Any language associated with a particular file extension (see the various
|
Any language associated with a particular file extension (see the various
|
||||||
+I<lang>ext+ options) will be used in preference to the language specified
|
+I<lang>ext+ options) will be used in preference to the language specified
|
||||||
@@ -597,7 +612,7 @@ legacy mixed language designs, the various +I<lang>ext+ options should be
|
|||||||
used.
|
used.
|
||||||
|
|
||||||
If no language is specified, either by this flag or +I<lang>ext+ options,
|
If no language is specified, either by this flag or +I<lang>ext+ options,
|
||||||
then the latest SystemVerilog language (IEEE 1800-2009) is used.
|
then the latest SystemVerilog language (IEEE 1800-2012) is used.
|
||||||
|
|
||||||
=item +define+I<var>+I<value>
|
=item +define+I<var>+I<value>
|
||||||
|
|
||||||
@@ -740,7 +755,9 @@ to gcc -MP option.
|
|||||||
=item --Mdir I<directory>
|
=item --Mdir I<directory>
|
||||||
|
|
||||||
Specifies the name of the Make object directory. All generated files will
|
Specifies the name of the Make object directory. All generated files will
|
||||||
be placed in this directory. If not specified, "obj_dir" is used.
|
be placed in this directory. If not specified, "obj_dir" is used. The
|
||||||
|
directory is created if it does not exist and the parent directories exist;
|
||||||
|
otherwise manually create the Mdir before calling Verilator.
|
||||||
|
|
||||||
=item --mod-prefix I<topname>
|
=item --mod-prefix I<topname>
|
||||||
|
|
||||||
@@ -782,6 +799,12 @@ mappings of optimizations to -O letters.
|
|||||||
Specify the name for the final executable built if using --exe. Defaults
|
Specify the name for the final executable built if using --exe. Defaults
|
||||||
to the --prefix if not specified.
|
to the --prefix if not specified.
|
||||||
|
|
||||||
|
=item --no-order-clock-delay
|
||||||
|
|
||||||
|
Rarely needed. Disables a bug fix for ordering of clock enables with
|
||||||
|
delayed assignments. This flag should only be used when suggested by the
|
||||||
|
developers.
|
||||||
|
|
||||||
=item --output-split I<bytes>
|
=item --output-split I<bytes>
|
||||||
|
|
||||||
Enables splitting the output .cpp/.sp files into multiple outputs. When a
|
Enables splitting the output .cpp/.sp files into multiple outputs. When a
|
||||||
@@ -804,6 +827,11 @@ worse with decreasing split values. Note that this option is stronger than
|
|||||||
--output-split in the sense that --output-split will not split inside a
|
--output-split in the sense that --output-split will not split inside a
|
||||||
function.
|
function.
|
||||||
|
|
||||||
|
=item --output-split-ctrace I<statements>
|
||||||
|
|
||||||
|
Enables splitting trace functions in the output .cpp/.sp files into
|
||||||
|
multiple functions. Defaults to same setting as --output-split-cfuncs.
|
||||||
|
|
||||||
=item --pins64
|
=item --pins64
|
||||||
|
|
||||||
Backward compatible alias for "--pins-bv 65". Note that's a 65, not a 64.
|
Backward compatible alias for "--pins-bv 65". Note that's a 65, not a 64.
|
||||||
@@ -816,6 +844,20 @@ wide should use sc_bv's instead of uint32/vluint64_t's. The default is
|
|||||||
33". The more sc_bv is used, the worse for performance. Use the
|
33". The more sc_bv is used, the worse for performance. Use the
|
||||||
"/*verilator sc_bv*/" attribute to select specific ports to be sc_bv.
|
"/*verilator sc_bv*/" attribute to select specific ports to be sc_bv.
|
||||||
|
|
||||||
|
=item --pins-sc-uint
|
||||||
|
|
||||||
|
Specifies SystemC inputs/outputs of greater than 2 bits wide should use
|
||||||
|
sc_uint between 2 and 64. When combined with the "--pins-sc-biguint"
|
||||||
|
combination, it results in sc_uint being used between 2 and 64 and
|
||||||
|
sc_biguint being used between 65 and 512.
|
||||||
|
|
||||||
|
=item --pins-sc-biguint
|
||||||
|
|
||||||
|
Specifies SystemC inputs/outputs of greater than 65 bits wide should use
|
||||||
|
sc_biguint between 65 and 512, and sc_bv from 513 upwards. When combined
|
||||||
|
with the "--pins-sc-uint" combination, it results in sc_uint being used
|
||||||
|
between 2 and 64 and sc_biguint being used between 65 and 512.
|
||||||
|
|
||||||
=item --pins-uint8
|
=item --pins-uint8
|
||||||
|
|
||||||
Specifies SystemC inputs/outputs that are smaller than the --pins-bv
|
Specifies SystemC inputs/outputs that are smaller than the --pins-bv
|
||||||
@@ -877,6 +919,27 @@ inlining. This will also turn off inlining as if all modules had a
|
|||||||
/*verilator public_module*/, unless the module specifically enabled it with
|
/*verilator public_module*/, unless the module specifically enabled it with
|
||||||
/*verilator inline_module*/.
|
/*verilator inline_module*/.
|
||||||
|
|
||||||
|
=item --report-unoptflat
|
||||||
|
|
||||||
|
Extra diagnostics for UNOPTFLAT warnings. This includes for each loop, the
|
||||||
|
10 widest variables in the loop, and the 10 most fanned out variables in
|
||||||
|
the loop. These are candidates for splitting into multiple variables to
|
||||||
|
break the loop.
|
||||||
|
|
||||||
|
In addition produces a GraphViz DOT file of the entire strongly connected
|
||||||
|
components within the source associated with each loop. This is produced
|
||||||
|
irrespective of whether --dump-tree is set. Such graphs may help in
|
||||||
|
analysing the problem, but can be very large indeed.
|
||||||
|
|
||||||
|
Various commands exist for viewing and manipulating DOT files. For example
|
||||||
|
the I<dot> command can be used to convert a DOT file to a PDF for
|
||||||
|
printing. For example:
|
||||||
|
|
||||||
|
dot -Tpdf -O Vt_unoptflat_simple_2_35_unoptflat.dot
|
||||||
|
|
||||||
|
will generate a PDF Vt_unoptflat_simple_2_35_unoptflat.dot.pdf from the DOT
|
||||||
|
file.
|
||||||
|
|
||||||
=item --savable
|
=item --savable
|
||||||
|
|
||||||
Enable including save and restore functions in the generated model.
|
Enable including save and restore functions in the generated model.
|
||||||
@@ -918,7 +981,7 @@ compatibility with other simulators.
|
|||||||
|
|
||||||
=item +systemverilogext+I<ext>
|
=item +systemverilogext+I<ext>
|
||||||
|
|
||||||
A synonym for C<+1800-2009ext+>I<ext>.
|
A synonym for C<+1800-2012ext+>I<ext>.
|
||||||
|
|
||||||
=item --top-module I<topname>
|
=item --top-module I<topname>
|
||||||
|
|
||||||
@@ -959,6 +1022,13 @@ Rarely needed. Specify the maximum bit width of a signal that may be
|
|||||||
traced. Defaults to 256, as tracing large vectors may greatly slow traced
|
traced. Defaults to 256, as tracing large vectors may greatly slow traced
|
||||||
simulations.
|
simulations.
|
||||||
|
|
||||||
|
=item --trace-structs
|
||||||
|
|
||||||
|
Enable tracing to show the name of packed structure, union, and packed
|
||||||
|
array fields, rather than a simgle combined packed bus. Due to VCD file
|
||||||
|
format constraints this may result in significantly slower trace times and
|
||||||
|
larger trace files.
|
||||||
|
|
||||||
=item --trace-underscore
|
=item --trace-underscore
|
||||||
|
|
||||||
Enable tracing of signals that start with an underscore. Normally, these
|
Enable tracing of signals that start with an underscore. Normally, these
|
||||||
@@ -1027,10 +1097,10 @@ Disable the specified warning message.
|
|||||||
=item -Wno-lint
|
=item -Wno-lint
|
||||||
|
|
||||||
Disable all lint related warning messages, and all style warnings. This is
|
Disable all lint related warning messages, and all style warnings. This is
|
||||||
equivalent to "-Wno-CASEINCOMPLETE -Wno-CASEOVERLAP -Wno-CASEX
|
equivalent to "-Wno-ALWCOMBORDER -Wno-CASEINCOMPLETE -Wno-CASEOVERLAP
|
||||||
-Wno-CASEWITHX -Wno-CMPCONST -Wno-ENDLABEL -Wno-IMPLICIT -Wno-LITENDIAN
|
-Wno-CASEX -Wno-CASEWITHX -Wno-CMPCONST -Wno-ENDLABEL -Wno-IMPLICIT
|
||||||
-Wno-PINMISSING -Wno-SYNCASYNCNET -Wno-UNDRIVEN -Wno-UNSIGNED -Wno-UNUSED
|
-Wno-LITENDIAN -Wno-PINMISSING -Wno-SYNCASYNCNET -Wno-UNDRIVEN
|
||||||
-Wno-WIDTH" plus the list shown for Wno-style.
|
-Wno-UNSIGNED -Wno-UNUSED -Wno-WIDTH" plus the list shown for Wno-style.
|
||||||
|
|
||||||
It is strongly recommended you cleanup your code rather than using this
|
It is strongly recommended you cleanup your code rather than using this
|
||||||
option, it is only intended to be use when running test-cases of code
|
option, it is only intended to be use when running test-cases of code
|
||||||
@@ -1059,9 +1129,10 @@ Enables the specified warning message.
|
|||||||
|
|
||||||
Enable all lint related warning messages (note by default they are already
|
Enable all lint related warning messages (note by default they are already
|
||||||
enabled), but do not affect style messages. This is equivalent to
|
enabled), but do not affect style messages. This is equivalent to
|
||||||
"-Wwarn-CASEINCOMPLETE -Wwarn-CASEOVERLAP -Wwarn-CASEX -Wwarn-CASEWITHX
|
"-Wwarn-ALWCOMBORDER -Wwarn-CASEINCOMPLETE -Wwarn-CASEOVERLAP -Wwarn-CASEX
|
||||||
-Wwarn-CMPCONST -Wwarn-ENDLABEL -Wwarn-IMPLICIT -Wwarn-LITENDIAN
|
-Wwarn-CASEWITHX -Wwarn-CMPCONST -Wwarn-ENDLABEL -Wwarn-IMPLICIT
|
||||||
-Wwarn-PINMISSING -Wwarn-REALCVT -Wwarn-UNSIGNED -Wwarn-WIDTH".
|
-Wwarn-LITENDIAN -Wwarn-PINMISSING -Wwarn-REALCVT -Wwarn-UNSIGNED
|
||||||
|
-Wwarn-WIDTH".
|
||||||
|
|
||||||
=item -Wwarn-style
|
=item -Wwarn-style
|
||||||
|
|
||||||
@@ -1878,29 +1949,25 @@ uwire keyword.
|
|||||||
|
|
||||||
=head2 SystemVerilog 2005 (IEEE 1800-2005) Support
|
=head2 SystemVerilog 2005 (IEEE 1800-2005) Support
|
||||||
|
|
||||||
Verilator currently has some support for SystemVerilog synthesis
|
|
||||||
constructs. As SystemVerilog features enter common usage they are added;
|
|
||||||
please file a bug if a feature you need is missing.
|
|
||||||
|
|
||||||
Verilator supports ==? and !=? operators, ++ and -- in some contexts,
|
Verilator supports ==? and !=? operators, ++ and -- in some contexts,
|
||||||
$bits, $countones, $error, $fatal, $info, $isunknown, $onehot, $onehot0,
|
$bits, $countones, $error, $fatal, $info, $isunknown, $onehot, $onehot0,
|
||||||
$unit, $warning, always_comb, always_ff, always_latch, bit, byte, chandle,
|
$unit, $warning, always_comb, always_ff, always_latch, bit, byte, chandle,
|
||||||
const, do-while, enum, export, final, import, int, logic, longint, package,
|
const, do-while, enum, export, final, import, int, interface, logic,
|
||||||
program, shortint, struct, time, typedef, union, var, void, priority
|
longint, modport, package, program, shortint, struct, time, typedef, union,
|
||||||
case/if, and unique case/if.
|
var, void, priority case/if, and unique case/if.
|
||||||
|
|
||||||
It also supports .name and .* interconnection.
|
It also supports .name and .* interconnection.
|
||||||
|
|
||||||
Verilator partially supports concurrent assert and cover statements; see
|
Verilator partially supports concurrent assert and cover statements; see
|
||||||
the enclosed coverage tests for the syntax which is allowed.
|
the enclosed coverage tests for the syntax which is allowed.
|
||||||
|
|
||||||
=head2 SystemVerilog 2009 (IEEE 1800-2009) Support
|
=head2 SystemVerilog 2012 (IEEE 1800-2012) Support
|
||||||
|
|
||||||
Verilator implements a full SystemVerilog 2009 preprocessor, including
|
Verilator implements a full SystemVerilog 2012 preprocessor, including
|
||||||
function call-like preprocessor defines, default define arguments,
|
function call-like preprocessor defines, default define arguments,
|
||||||
`__FILE__, `__LINE__ and `undefineall.
|
`__FILE__, `__LINE__ and `undefineall.
|
||||||
|
|
||||||
Verilator currently has some support for SystemVerilog 2009 synthesis
|
Verilator currently has some support for SystemVerilog synthesis
|
||||||
constructs. As SystemVerilog features enter common usage they are added;
|
constructs. As SystemVerilog features enter common usage they are added;
|
||||||
please file a bug if a feature you need is missing.
|
please file a bug if a feature you need is missing.
|
||||||
|
|
||||||
@@ -2563,6 +2630,12 @@ and continue keywords.
|
|||||||
Inside expressions may not include unpacked array traversal or $ as an
|
Inside expressions may not include unpacked array traversal or $ as an
|
||||||
upper bound. Case inside and case matches are also unsupported.
|
upper bound. Case inside and case matches are also unsupported.
|
||||||
|
|
||||||
|
=item interface
|
||||||
|
|
||||||
|
Interfaces and modports, including with generated data types are supported.
|
||||||
|
Generate blocks around modports are not supported, nor are virtual
|
||||||
|
interfaces nor unnamed interfaces.
|
||||||
|
|
||||||
=item priority if, unique if
|
=item priority if, unique if
|
||||||
|
|
||||||
Priority and unique if's are treated as normal ifs and not asserted to be
|
Priority and unique if's are treated as normal ifs and not asserted to be
|
||||||
@@ -2673,6 +2746,20 @@ List of all warnings:
|
|||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
|
=item ALWCOMBORDER
|
||||||
|
|
||||||
|
Warns that an always_comb block has a variable which is set after it is
|
||||||
|
used. This may cause simulation-synthesis mismatches, as not all
|
||||||
|
commercial simulators allow this ordering.
|
||||||
|
|
||||||
|
always_comb begin
|
||||||
|
a = b;
|
||||||
|
b = 1;
|
||||||
|
end
|
||||||
|
|
||||||
|
Ignoring this warning will only suppress the lint check, it will simulate
|
||||||
|
correctly.
|
||||||
|
|
||||||
=item ASSIGNIN
|
=item ASSIGNIN
|
||||||
|
|
||||||
Error that an assignment is being made to an input signal. This is almost
|
Error that an assignment is being made to an input signal. This is almost
|
||||||
@@ -2840,7 +2927,8 @@ correctly.
|
|||||||
=item DETECTARRAY
|
=item DETECTARRAY
|
||||||
|
|
||||||
Error when Verilator tries to deal with a combinatorial loop that could not be
|
Error when Verilator tries to deal with a combinatorial loop that could not be
|
||||||
flattened, and which involves a structure. This typically ocurrs when
|
flattened, and which involves a datatype which Verilator cannot handle, such
|
||||||
|
as an unpacked struct or a large unpacked array. This typically ocurrs when
|
||||||
-Wno-UNOPTFLAT has been used to override an UNOPTFLAT warning (see below).
|
-Wno-UNOPTFLAT has been used to override an UNOPTFLAT warning (see below).
|
||||||
|
|
||||||
The solution is to break the loop, as described for UNOPTFLAT.
|
The solution is to break the loop, as described for UNOPTFLAT.
|
||||||
@@ -2926,7 +3014,7 @@ simulators.
|
|||||||
|
|
||||||
=item LITENDIAN
|
=item LITENDIAN
|
||||||
|
|
||||||
Warns that a vector is declared with little endian bit numbering
|
Warns that a packed vector is declared with little endian bit numbering
|
||||||
(i.e. [0:7]). Big endian bit numbering is now the overwhelming standard,
|
(i.e. [0:7]). Big endian bit numbering is now the overwhelming standard,
|
||||||
and little numbering is now thus often due to simple oversight instead of
|
and little numbering is now thus often due to simple oversight instead of
|
||||||
intent.
|
intent.
|
||||||
@@ -3145,9 +3233,21 @@ The UNOPTFLAT warning may also occur where outputs from a block of logic
|
|||||||
are independent, but occur in the same always block. To fix this, use the
|
are independent, but occur in the same always block. To fix this, use the
|
||||||
isolate_assignments meta comment described above.
|
isolate_assignments meta comment described above.
|
||||||
|
|
||||||
|
To assist in resolving UNOPTFLAT, the option C<--report-unoptflat> can be
|
||||||
|
used, which will provide suggestions for variables that can be split up,
|
||||||
|
and a graph of all the nodes connected in the loop. See the L<Arguments>
|
||||||
|
section for more details.
|
||||||
|
|
||||||
Ignoring this warning will only slow simulations, it will simulate
|
Ignoring this warning will only slow simulations, it will simulate
|
||||||
correctly.
|
correctly.
|
||||||
|
|
||||||
|
=item UNPACKED
|
||||||
|
|
||||||
|
Warns that unpacked structs and unions are not supported.
|
||||||
|
|
||||||
|
Ignoring this warning will make Verilator treat the structure as packed,
|
||||||
|
which may make Verilator simulations differ from other simulators.
|
||||||
|
|
||||||
=item UNSIGNED
|
=item UNSIGNED
|
||||||
|
|
||||||
Warns that you are comparing a unsigned value in a way that implies it is
|
Warns that you are comparing a unsigned value in a way that implies it is
|
||||||
@@ -3731,7 +3831,7 @@ Thanks to them, and all those we've missed including above.
|
|||||||
|
|
||||||
The latest version is available from L<http://www.veripool.org/>.
|
The latest version is available from L<http://www.veripool.org/>.
|
||||||
|
|
||||||
Copyright 2003-2013 by Wilson Snyder. Verilator is free software; you can
|
Copyright 2003-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
redistribute it and/or modify the Verilator internals under the terms of
|
redistribute it and/or modify the Verilator internals under the terms of
|
||||||
either the GNU Lesser General Public License Version 3 or the Perl Artistic
|
either the GNU Lesser General Public License Version 3 or the Perl Artistic
|
||||||
License Version 2.0.
|
License Version 2.0.
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ Do not show differences in line numbering.
|
|||||||
|
|
||||||
The latest version is available from L<http://www.veripool.org/verilator>.
|
The latest version is available from L<http://www.veripool.org/verilator>.
|
||||||
|
|
||||||
Copyright 2005-2013 by Wilson Snyder. This package is free software; you can
|
Copyright 2005-2014 by Wilson Snyder. This package is free software; you can
|
||||||
redistribute it and/or modify it under the terms of either the GNU Lesser
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ eval 'exec perl -wS $0 ${1+"$@"}'
|
|||||||
if 0;
|
if 0;
|
||||||
# DESCRIPTION: Print include statements for each ARGV
|
# DESCRIPTION: Print include statements for each ARGV
|
||||||
#
|
#
|
||||||
# Copyright 2003-2013 by Wilson Snyder. This package is free software; you can
|
# Copyright 2003-2014 by Wilson Snyder. This package is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ Displays this message and program version and exits.
|
|||||||
|
|
||||||
The latest version is available from L<http://www.veripool.org/>.
|
The latest version is available from L<http://www.veripool.org/>.
|
||||||
|
|
||||||
Copyright 2007-2013 by Wilson Snyder. Verilator is free software; you can
|
Copyright 2007-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
redistribute it and/or modify it under the terms of either the GNU Lesser
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
# DESCRIPTION: Process this file with autoconf to produce a configure script.
|
# DESCRIPTION: Process this file with autoconf to produce a configure script.
|
||||||
#
|
#
|
||||||
# Copyright 2003-2013 by Wilson Snyder. Verilator is free software; you can
|
# Copyright 2003-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
#AC_INIT([Verilator],[#.### YYYY-MM-DD])
|
#AC_INIT([Verilator],[#.### YYYY-MM-DD])
|
||||||
#AC_INIT([Verilator],[#.### devel])
|
#AC_INIT([Verilator],[#.### devel])
|
||||||
AC_INIT([Verilator],[3.845 2013-02-04])
|
AC_INIT([Verilator],[3.855 2014-01-18])
|
||||||
AC_CONFIG_HEADER(src/config_build.h)
|
AC_CONFIG_HEADER(src/config_build.h)
|
||||||
AC_CONFIG_FILES(Makefile src/Makefile src/Makefile_obj include/verilated.mk include/verilated_config.h)
|
AC_CONFIG_FILES(Makefile src/Makefile src/Makefile_obj include/verilated.mk include/verilated_config.h)
|
||||||
|
|
||||||
|
|||||||
+19
-6
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -769,6 +769,15 @@ void VL_SFORMAT_X(int obits, void* destp, const char* formatp, ...) {
|
|||||||
_VL_STRING_TO_VINT(obits, destp, (int)output.length(), output.c_str());
|
_VL_STRING_TO_VINT(obits, destp, (int)output.length(), output.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VL_SFORMAT_X(int obits_ignored, string &output, const char* formatp, ...) {
|
||||||
|
if (obits_ignored) {}
|
||||||
|
output = "";
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap,formatp);
|
||||||
|
_vl_vsformat(output, formatp, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
string VL_SFORMATF_NX(const char* formatp, ...) {
|
string VL_SFORMATF_NX(const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD string output; // static only for speed
|
VL_STATIC_OR_THREAD string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
@@ -1075,6 +1084,10 @@ const char* Verilated::commandArgsPlusMatch(const char* prefixp) {
|
|||||||
return VerilatedImp::argPlusMatch(prefixp).c_str();
|
return VerilatedImp::argPlusMatch(prefixp).c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Verilated::internalsDump() {
|
||||||
|
VerilatedImp::internalsDump();
|
||||||
|
}
|
||||||
|
|
||||||
void Verilated::scopesDump() {
|
void Verilated::scopesDump() {
|
||||||
VerilatedImp::scopesDump();
|
VerilatedImp::scopesDump();
|
||||||
}
|
}
|
||||||
@@ -1110,7 +1123,7 @@ vluint32_t VerilatedVar::entSize() const {
|
|||||||
case VLVT_UINT16: size=sizeof(SData); break;
|
case VLVT_UINT16: size=sizeof(SData); break;
|
||||||
case VLVT_UINT32: size=sizeof(IData); break;
|
case VLVT_UINT32: size=sizeof(IData); break;
|
||||||
case VLVT_UINT64: size=sizeof(QData); break;
|
case VLVT_UINT64: size=sizeof(QData); break;
|
||||||
case VLVT_WDATA: size=VL_WORDS_I(range().bits())*sizeof(IData); break;
|
case VLVT_WDATA: size=VL_WORDS_I(range().elements())*sizeof(IData); break;
|
||||||
default: size=0; break;
|
default: size=0; break;
|
||||||
}
|
}
|
||||||
return size;
|
return size;
|
||||||
@@ -1182,11 +1195,11 @@ void VerilatedScope::varInsert(int finalize, const char* namep, void* datap,
|
|||||||
int msb = va_arg(ap,int);
|
int msb = va_arg(ap,int);
|
||||||
int lsb = va_arg(ap,int);
|
int lsb = va_arg(ap,int);
|
||||||
if (i==0) {
|
if (i==0) {
|
||||||
var.m_range.m_lhs = msb;
|
var.m_range.m_left = msb;
|
||||||
var.m_range.m_rhs = lsb;
|
var.m_range.m_right = lsb;
|
||||||
} else if (i==1) {
|
} else if (i==1) {
|
||||||
var.m_array.m_lhs = msb;
|
var.m_array.m_left = msb;
|
||||||
var.m_array.m_rhs = lsb;
|
var.m_array.m_right = lsb;
|
||||||
} else {
|
} else {
|
||||||
// We could have a linked list of ranges, but really this whole thing needs
|
// We could have a linked list of ranges, but really this whole thing needs
|
||||||
// to be generalized to support structs and unions, etc.
|
// to be generalized to support structs and unions, etc.
|
||||||
|
|||||||
+38
-5
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -145,7 +145,7 @@ public:
|
|||||||
# define VL_CELL(instname,type) ///< Declare a cell, ala SP_CELL
|
# define VL_CELL(instname,type) ///< Declare a cell, ala SP_CELL
|
||||||
|
|
||||||
/// Declare a module, ala SC_MODULE
|
/// Declare a module, ala SC_MODULE
|
||||||
# define VL_MODULE(modname) struct modname : public VerilatedModule
|
# define VL_MODULE(modname) class modname : public VerilatedModule
|
||||||
|
|
||||||
/// Constructor, ala SC_CTOR
|
/// Constructor, ala SC_CTOR
|
||||||
# define VL_CTOR(modname) modname(const char* __VCname="")
|
# define VL_CTOR(modname) modname(const char* __VCname="")
|
||||||
@@ -216,9 +216,8 @@ public: // But internals only - called from VerilatedModule's
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
/// Verilator global static information class
|
/// Verilator global static information class
|
||||||
|
|
||||||
struct Verilated {
|
class Verilated {
|
||||||
// MEMBERS
|
// MEMBERS
|
||||||
private:
|
|
||||||
// Slow path variables
|
// Slow path variables
|
||||||
static VerilatedVoidCb s_flushCb; ///< Flush callback function
|
static VerilatedVoidCb s_flushCb; ///< Flush callback function
|
||||||
|
|
||||||
@@ -294,6 +293,11 @@ public:
|
|||||||
static const char* productName() { return VERILATOR_PRODUCT; }
|
static const char* productName() { return VERILATOR_PRODUCT; }
|
||||||
static const char* productVersion() { return VERILATOR_VERSION; }
|
static const char* productVersion() { return VERILATOR_VERSION; }
|
||||||
|
|
||||||
|
/// For debugging, print much of the Verilator internal state.
|
||||||
|
/// The output of this function may change in future
|
||||||
|
/// releases - contact the authors before production use.
|
||||||
|
static void internalsDump();
|
||||||
|
|
||||||
/// For debugging, print text list of all scope names with
|
/// For debugging, print text list of all scope names with
|
||||||
/// dpiImport/Export context. This function may change in future
|
/// dpiImport/Export context. This function may change in future
|
||||||
/// releases - contact the authors before production use.
|
/// releases - contact the authors before production use.
|
||||||
@@ -547,6 +551,7 @@ static inline void VL_ASSIGNBIT_WO(int, int bit, WDataOutP owp, IData) {
|
|||||||
//===================================================================
|
//===================================================================
|
||||||
// SYSTEMC OPERATORS
|
// SYSTEMC OPERATORS
|
||||||
// Copying verilog format to systemc integers and bit vectors.
|
// Copying verilog format to systemc integers and bit vectors.
|
||||||
|
// Get a SystemC variable
|
||||||
|
|
||||||
#define VL_ASSIGN_ISI(obits,vvar,svar) { (vvar) = VL_CLEAN_II((obits),(obits),(svar).read()); }
|
#define VL_ASSIGN_ISI(obits,vvar,svar) { (vvar) = VL_CLEAN_II((obits),(obits),(svar).read()); }
|
||||||
#define VL_ASSIGN_QSQ(obits,vvar,svar) { (vvar) = VL_CLEAN_QQ((obits),(obits),(svar).read()); }
|
#define VL_ASSIGN_QSQ(obits,vvar,svar) { (vvar) = VL_CLEAN_QQ((obits),(obits),(svar).read()); }
|
||||||
@@ -564,7 +569,21 @@ static inline void VL_ASSIGNBIT_WO(int, int bit, WDataOutP owp, IData) {
|
|||||||
owp[words-1] &= VL_MASK_I(obits); \
|
owp[words-1] &= VL_MASK_I(obits); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VL_ASSIGN_ISU(obits,vvar,svar) { (vvar) = VL_CLEAN_II((obits),(obits),(svar).read().to_uint()); }
|
||||||
|
#define VL_ASSIGN_QSU(obits,vvar,svar) { (vvar) = VL_CLEAN_QQ((obits),(obits),(svar).read().to_uint64()); }
|
||||||
|
#define VL_ASSIGN_WSB(obits,owp,svar) { \
|
||||||
|
int words = VL_WORDS_I(obits); \
|
||||||
|
sc_biguint<obits> _butemp = (svar).read(); \
|
||||||
|
for (int i=0; i < words; i++) { \
|
||||||
|
int msb = ((i+1)*VL_WORDSIZE) - 1; \
|
||||||
|
msb = (msb >= obits) ? (obits-1) : msb; \
|
||||||
|
owp[i] = _butemp.range(msb,i*VL_WORDSIZE).to_uint(); \
|
||||||
|
} \
|
||||||
|
owp[words-1] &= VL_MASK_I(obits); \
|
||||||
|
}
|
||||||
|
|
||||||
// Copying verilog format from systemc integers and bit vectors.
|
// Copying verilog format from systemc integers and bit vectors.
|
||||||
|
// Set a SystemC variable
|
||||||
|
|
||||||
#define VL_ASSIGN_SII(obits,svar,vvar) { (svar).write(vvar); }
|
#define VL_ASSIGN_SII(obits,svar,vvar) { (svar).write(vvar); }
|
||||||
#define VL_ASSIGN_SQQ(obits,svar,vvar) { (svar).write(vvar); }
|
#define VL_ASSIGN_SQQ(obits,svar,vvar) { (svar).write(vvar); }
|
||||||
@@ -586,6 +605,20 @@ static inline void VL_ASSIGNBIT_WO(int, int bit, WDataOutP owp, IData) {
|
|||||||
svar.write(_bvtemp); \
|
svar.write(_bvtemp); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VL_ASSIGN_SUI(obits,svar,rd) { (svar).write(rd); }
|
||||||
|
#define VL_ASSIGN_SUQ(obits,svar,rd) { (svar).write(rd); }
|
||||||
|
#define VL_ASSIGN_SBI(obits,svar,rd) { (svar).write(rd); }
|
||||||
|
#define VL_ASSIGN_SBQ(obits,svar,rd) { (svar).write(rd); }
|
||||||
|
#define VL_ASSIGN_SBW(obits,svar,rwp) { \
|
||||||
|
sc_biguint<obits> _butemp; \
|
||||||
|
for (int i=0; i < VL_WORDS_I(obits); i++) { \
|
||||||
|
int msb = ((i+1)*VL_WORDSIZE) - 1; \
|
||||||
|
msb = (msb >= obits) ? (obits-1) : msb; \
|
||||||
|
_butemp.range(msb,i*VL_WORDSIZE) = rwp[i]; \
|
||||||
|
} \
|
||||||
|
svar.write(_butemp); \
|
||||||
|
}
|
||||||
|
|
||||||
//===================================================================
|
//===================================================================
|
||||||
// Extending sizes
|
// Extending sizes
|
||||||
|
|
||||||
@@ -837,7 +870,7 @@ static inline WDataOutP VL_OR_W(int words, WDataOutP owp,WDataInP lwp,WDataInP r
|
|||||||
}
|
}
|
||||||
// EMIT_RULE: VL_CHANGEXOR: oclean=1; obits=32; lbits==rbits;
|
// EMIT_RULE: VL_CHANGEXOR: oclean=1; obits=32; lbits==rbits;
|
||||||
static inline IData VL_CHANGEXOR_W(int words, WDataInP lwp,WDataInP rwp){
|
static inline IData VL_CHANGEXOR_W(int words, WDataInP lwp,WDataInP rwp){
|
||||||
IData od;
|
IData od = 0;
|
||||||
for (int i=0; (i < words); i++) od |= (lwp[i] ^ rwp[i]);
|
for (int i=0; (i < words); i++) od |= (lwp[i] ^ rwp[i]);
|
||||||
return(od);
|
return(od);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
######################################################################
|
######################################################################
|
||||||
# DESCRIPTION: Makefile commands for all verilated target files
|
# DESCRIPTION: Makefile commands for all verilated target files
|
||||||
#
|
#
|
||||||
# Copyright 2003-2013 by Wilson Snyder. Verilator is free software; you can
|
# Copyright 2003-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
# redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
# General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2012 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2009-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2009-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2010-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2010-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -41,11 +41,15 @@ inline string VL_CVT_PACK_STR_NQ(QData lhs) {
|
|||||||
IData lw[2]; VL_SET_WQ(lw, lhs);
|
IData lw[2]; VL_SET_WQ(lw, lhs);
|
||||||
return VL_CVT_PACK_STR_NW(2, lw);
|
return VL_CVT_PACK_STR_NW(2, lw);
|
||||||
}
|
}
|
||||||
|
inline string VL_CVT_PACK_STR_NQ(string lhs) {
|
||||||
|
return lhs;
|
||||||
|
}
|
||||||
inline string VL_CVT_PACK_STR_NI(IData lhs) {
|
inline string VL_CVT_PACK_STR_NI(IData lhs) {
|
||||||
IData lw[1]; lw[0] = lhs;
|
IData lw[1]; lw[0] = lhs;
|
||||||
return VL_CVT_PACK_STR_NW(1, lw);
|
return VL_CVT_PACK_STR_NW(1, lw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void VL_SFORMAT_X(int obits_ignored, string &output, const char* formatp, ...);
|
||||||
extern string VL_SFORMATF_NX(const char* formatp, ...);
|
extern string VL_SFORMATF_NX(const char* formatp, ...);
|
||||||
|
|
||||||
#endif // Guard
|
#endif // Guard
|
||||||
|
|||||||
+29
-3
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2009-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2009-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -78,6 +78,18 @@ public: // But only for verilated*.cpp
|
|||||||
m_fdps[2] = stderr;
|
m_fdps[2] = stderr;
|
||||||
}
|
}
|
||||||
~VerilatedImp() {}
|
~VerilatedImp() {}
|
||||||
|
static void internalsDump() {
|
||||||
|
VL_PRINTF("internalsDump:\n");
|
||||||
|
VL_PRINTF(" Argv:");
|
||||||
|
for (ArgVec::iterator it=s_s.m_argVec.begin(); it!=s_s.m_argVec.end(); ++it) {
|
||||||
|
VL_PRINTF(" %s",it->c_str());
|
||||||
|
}
|
||||||
|
VL_PRINTF("\n");
|
||||||
|
VL_PRINTF(" Version: %s %s\n", Verilated::productName(), Verilated::productVersion());
|
||||||
|
scopesDump();
|
||||||
|
exportsDump();
|
||||||
|
userDump();
|
||||||
|
}
|
||||||
|
|
||||||
// METHODS - arguments
|
// METHODS - arguments
|
||||||
static void commandArgs(int argc, const char** argv) {
|
static void commandArgs(int argc, const char** argv) {
|
||||||
@@ -129,6 +141,14 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static void userDump() {
|
||||||
|
bool first = true;
|
||||||
|
for (UserMap::iterator it=s_s.m_userMap.begin(); it!=s_s.m_userMap.end(); ++it) {
|
||||||
|
if (first) { VL_PRINTF(" userDump:\n"); first=false; }
|
||||||
|
VL_PRINTF(" DPI_USER_DATA scope %p key %p: %p\n",
|
||||||
|
it->first.first, it->first.second, it->second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public: // But only for verilated*.cpp
|
public: // But only for verilated*.cpp
|
||||||
// METHODS - scope name
|
// METHODS - scope name
|
||||||
@@ -150,9 +170,8 @@ public: // But only for verilated*.cpp
|
|||||||
ScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name());
|
ScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name());
|
||||||
if (it != s_s.m_nameMap.end()) s_s.m_nameMap.erase(it);
|
if (it != s_s.m_nameMap.end()) s_s.m_nameMap.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scopesDump() {
|
static void scopesDump() {
|
||||||
VL_PRINTF("scopesDump:\n");
|
VL_PRINTF(" scopesDump:\n");
|
||||||
for (ScopeNameMap::iterator it=s_s.m_nameMap.begin(); it!=s_s.m_nameMap.end(); ++it) {
|
for (ScopeNameMap::iterator it=s_s.m_nameMap.begin(); it!=s_s.m_nameMap.end(); ++it) {
|
||||||
const VerilatedScope* scopep = it->second;
|
const VerilatedScope* scopep = it->second;
|
||||||
scopep->scopeDump();
|
scopep->scopeDump();
|
||||||
@@ -194,6 +213,13 @@ public: // But only for verilated*.cpp
|
|||||||
}
|
}
|
||||||
return "*UNKNOWN*";
|
return "*UNKNOWN*";
|
||||||
}
|
}
|
||||||
|
static void exportsDump() {
|
||||||
|
bool first = true;
|
||||||
|
for (ExportNameMap::iterator it=s_s.m_exportMap.begin(); it!=s_s.m_exportMap.end(); ++it) {
|
||||||
|
if (first) { VL_PRINTF(" exportDump:\n"); first=false; }
|
||||||
|
VL_PRINTF(" DPI_EXPORT_NAME %05d: %s\n", it->second, it->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
// We don't free up m_exportMap until the end, because we can't be sure
|
// We don't free up m_exportMap until the end, because we can't be sure
|
||||||
// what other models are using the assigned funcnum's.
|
// what other models are using the assigned funcnum's.
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// THIS MODULE IS PUBLICLY LICENSED
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
//
|
//
|
||||||
// Copyright 2001-2013 by Wilson Snyder. This program is free software;
|
// Copyright 2001-2014 by Wilson Snyder. This program is free software;
|
||||||
// you can redistribute it and/or modify it under the terms of either the GNU
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// THIS MODULE IS PUBLICLY LICENSED
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
//
|
//
|
||||||
// Copyright 2012-2013 by Wilson Snyder. This program is free software;
|
// Copyright 2012-2014 by Wilson Snyder. This program is free software;
|
||||||
// you can redistribute it and/or modify it under the terms of either the GNU
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2009-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2009-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -45,19 +45,20 @@ struct VerilatedCStrCmp {
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
/// Verilator range
|
/// Verilator range
|
||||||
|
|
||||||
|
// See also V3Ast::VNumRange
|
||||||
class VerilatedRange {
|
class VerilatedRange {
|
||||||
int m_lhs;
|
int m_left;
|
||||||
int m_rhs;
|
int m_right;
|
||||||
protected:
|
protected:
|
||||||
friend class VerilatedVar;
|
friend class VerilatedVar;
|
||||||
friend class VerilatedScope;
|
friend class VerilatedScope;
|
||||||
VerilatedRange() : m_lhs(0), m_rhs(0) {}
|
VerilatedRange() : m_left(0), m_right(0) {}
|
||||||
void sets(int lhs, int rhs) { m_lhs=lhs; m_rhs=rhs; }
|
void sets(int left, int right) { m_left=left; m_right=right; }
|
||||||
public:
|
public:
|
||||||
~VerilatedRange() {}
|
~VerilatedRange() {}
|
||||||
int lhs() const { return m_lhs; }
|
int left() const { return m_left; }
|
||||||
int rhs() const { return m_rhs; }
|
int right() const { return m_right; }
|
||||||
int bits() const { return (VL_LIKELY(m_lhs>=m_rhs)?(m_lhs-m_rhs+1):(m_rhs-m_lhs+1)); }
|
int elements() const { return (VL_LIKELY(m_left>=m_right)?(m_left-m_right+1):(m_right-m_left+1)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@@ -92,7 +93,8 @@ public:
|
|||||||
//======================================================================
|
//======================================================================
|
||||||
/// Types
|
/// Types
|
||||||
|
|
||||||
struct VerilatedVarNameMap : public map<const char*, VerilatedVar, VerilatedCStrCmp> {
|
class VerilatedVarNameMap : public map<const char*, VerilatedVar, VerilatedCStrCmp> {
|
||||||
|
public:
|
||||||
VerilatedVarNameMap() {}
|
VerilatedVarNameMap() {}
|
||||||
~VerilatedVarNameMap() {}
|
~VerilatedVarNameMap() {}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// THIS MODULE IS PUBLICLY LICENSED
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
//
|
//
|
||||||
// Copyright 2001-2013 by Wilson Snyder. This program is free software;
|
// Copyright 2001-2014 by Wilson Snyder. This program is free software;
|
||||||
// you can redistribute it and/or modify it under the terms of either the GNU
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
//
|
//
|
||||||
@@ -157,6 +157,8 @@ void VerilatedVcd::openNext (bool incFilename) {
|
|||||||
|
|
||||||
void VerilatedVcd::makeNameMap() {
|
void VerilatedVcd::makeNameMap() {
|
||||||
// Take signal information from each module and build m_namemapp
|
// Take signal information from each module and build m_namemapp
|
||||||
|
deleteNameMap();
|
||||||
|
m_nextCode = 1;
|
||||||
m_namemapp = new NameMap;
|
m_namemapp = new NameMap;
|
||||||
for (vluint32_t ent = 0; ent< m_callbacks.size(); ent++) {
|
for (vluint32_t ent = 0; ent< m_callbacks.size(); ent++) {
|
||||||
VerilatedVcdCallInfo *cip = m_callbacks[ent];
|
VerilatedVcdCallInfo *cip = m_callbacks[ent];
|
||||||
@@ -183,15 +185,20 @@ void VerilatedVcd::makeNameMap() {
|
|||||||
newname += hiername;
|
newname += hiername;
|
||||||
newmapp->insert(make_pair(newname,decl));
|
newmapp->insert(make_pair(newname,decl));
|
||||||
}
|
}
|
||||||
delete m_namemapp; m_namemapp=NULL;
|
deleteNameMap();
|
||||||
m_namemapp = newmapp;
|
m_namemapp = newmapp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VerilatedVcd::deleteNameMap() {
|
||||||
|
if (m_namemapp) { delete m_namemapp; m_namemapp=NULL; }
|
||||||
|
}
|
||||||
|
|
||||||
VerilatedVcd::~VerilatedVcd() {
|
VerilatedVcd::~VerilatedVcd() {
|
||||||
close();
|
close();
|
||||||
if (m_wrBufp) { delete[] m_wrBufp; m_wrBufp=NULL; }
|
if (m_wrBufp) { delete[] m_wrBufp; m_wrBufp=NULL; }
|
||||||
if (m_sigs_oldvalp) { delete[] m_sigs_oldvalp; m_sigs_oldvalp=NULL; }
|
if (m_sigs_oldvalp) { delete[] m_sigs_oldvalp; m_sigs_oldvalp=NULL; }
|
||||||
|
deleteNameMap();
|
||||||
// Remove from list of traces
|
// Remove from list of traces
|
||||||
vector<VerilatedVcd*>::iterator pos = find(s_vcdVecp.begin(), s_vcdVecp.end(), this);
|
vector<VerilatedVcd*>::iterator pos = find(s_vcdVecp.begin(), s_vcdVecp.end(), this);
|
||||||
if (pos != s_vcdVecp.end()) { s_vcdVecp.erase(pos); }
|
if (pos != s_vcdVecp.end()) { s_vcdVecp.erase(pos); }
|
||||||
@@ -414,7 +421,7 @@ void VerilatedVcd::dumpHeader () {
|
|||||||
assert (m_modDepth==0);
|
assert (m_modDepth==0);
|
||||||
|
|
||||||
// Reclaim storage
|
// Reclaim storage
|
||||||
delete m_namemapp;
|
deleteNameMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VerilatedVcd::module (string name) {
|
void VerilatedVcd::module (string name) {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// THIS MODULE IS PUBLICLY LICENSED
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
//
|
//
|
||||||
// Copyright 2001-2013 by Wilson Snyder. This program is free software;
|
// Copyright 2001-2014 by Wilson Snyder. This program is free software;
|
||||||
// you can redistribute it and/or modify it under the terms of either the GNU
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
//
|
//
|
||||||
@@ -57,7 +57,8 @@ typedef void (*VerilatedVcdCallback_t)(VerilatedVcd* vcdp, void* userthis, vluin
|
|||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
// VerilatedVcd
|
// VerilatedVcd
|
||||||
/// Create a SystemPerl VCD dump
|
/// Base class to create a Verilator VCD dump
|
||||||
|
/// This is an internally used class - see VerilatedVcdC for what to call from applications
|
||||||
|
|
||||||
class VerilatedVcd {
|
class VerilatedVcd {
|
||||||
private:
|
private:
|
||||||
@@ -100,6 +101,7 @@ private:
|
|||||||
void closeErr();
|
void closeErr();
|
||||||
void openNext();
|
void openNext();
|
||||||
void makeNameMap();
|
void makeNameMap();
|
||||||
|
void deleteNameMap();
|
||||||
void printIndent (int levelchange);
|
void printIndent (int levelchange);
|
||||||
void printStr (const char* str);
|
void printStr (const char* str);
|
||||||
void printQuad (vluint64_t n);
|
void printQuad (vluint64_t n);
|
||||||
@@ -400,8 +402,12 @@ public:
|
|||||||
bool isOpen() const { return m_sptrace.isOpen(); }
|
bool isOpen() const { return m_sptrace.isOpen(); }
|
||||||
// METHODS
|
// METHODS
|
||||||
/// Open a new VCD file
|
/// Open a new VCD file
|
||||||
|
/// This includes a complete header dump each time it is called,
|
||||||
|
/// just as if this object was deleted and reconstructed.
|
||||||
void open (const char* filename) { m_sptrace.open(filename); }
|
void open (const char* filename) { m_sptrace.open(filename); }
|
||||||
/// Continue a VCD dump by rotating to a new file name
|
/// Continue a VCD dump by rotating to a new file name
|
||||||
|
/// The header is only in the first file created, this allows
|
||||||
|
/// "cat" to be used to combine the header plus any number of data files.
|
||||||
void openNext (bool incFilename=true) { m_sptrace.openNext(incFilename); }
|
void openNext (bool incFilename=true) { m_sptrace.openNext(incFilename); }
|
||||||
/// Set size in megabytes after which new file should be created
|
/// Set size in megabytes after which new file should be created
|
||||||
void rolloverMB(size_t rolloverMB) { m_sptrace.rolloverMB(rolloverMB); };
|
void rolloverMB(size_t rolloverMB) { m_sptrace.rolloverMB(rolloverMB); };
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// THIS MODULE IS PUBLICLY LICENSED
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
//
|
//
|
||||||
// Copyright 2001-2013 by Wilson Snyder. This program is free software;
|
// Copyright 2001-2014 by Wilson Snyder. This program is free software;
|
||||||
// you can redistribute it and/or modify it under the terms of either the GNU
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// THIS MODULE IS PUBLICLY LICENSED
|
// THIS MODULE IS PUBLICLY LICENSED
|
||||||
//
|
//
|
||||||
// Copyright 2001-2013 by Wilson Snyder. This program is free software;
|
// Copyright 2001-2014 by Wilson Snyder. This program is free software;
|
||||||
// you can redistribute it and/or modify it under the terms of either the GNU
|
// you can redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
// Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2009-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2009-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+180
-75
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2009-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2009-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
// Internal macros
|
// Internal macros
|
||||||
|
|
||||||
#define _VL_VPI_INTERNAL VerilatedVpi::error_info()->setMessage(vpiInternal)->setMessage
|
#define _VL_VPI_INTERNAL VerilatedVpi::error_info()->setMessage(vpiInternal)->setMessage
|
||||||
#define _VL_VPI_SYSTEM VerilatedVpi::error_info()->setMessage(vpiSystem )->setMessage
|
#define _VL_VPI_SYSTEM VerilatedVpi::error_info()->setMessage(vpiSystem )->setMessage
|
||||||
#define _VL_VPI_ERROR VerilatedVpi::error_info()->setMessage(vpiError )->setMessage
|
#define _VL_VPI_ERROR VerilatedVpi::error_info()->setMessage(vpiError )->setMessage
|
||||||
#define _VL_VPI_WARNING VerilatedVpi::error_info()->setMessage(vpiWarning )->setMessage
|
#define _VL_VPI_WARNING VerilatedVpi::error_info()->setMessage(vpiWarning )->setMessage
|
||||||
#define _VL_VPI_NOTICE VerilatedVpi::error_info()->setMessage(vpiNotice )->setMessage
|
#define _VL_VPI_NOTICE VerilatedVpi::error_info()->setMessage(vpiNotice )->setMessage
|
||||||
@@ -52,6 +52,8 @@
|
|||||||
// Implementation
|
// Implementation
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <list>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#define VL_DEBUG_IF_PLI VL_DEBUG_IF
|
#define VL_DEBUG_IF_PLI VL_DEBUG_IF
|
||||||
#define VL_VPI_LINE_SIZE 8192
|
#define VL_VPI_LINE_SIZE 8192
|
||||||
@@ -94,6 +96,9 @@ public:
|
|||||||
virtual const char* name() { return "<null>"; }
|
virtual const char* name() { return "<null>"; }
|
||||||
virtual const char* fullname() { return "<null>"; }
|
virtual const char* fullname() { return "<null>"; }
|
||||||
virtual const char* defname() { return "<null>"; }
|
virtual const char* defname() { return "<null>"; }
|
||||||
|
virtual const vluint32_t type() { return 0; }
|
||||||
|
virtual const vluint32_t size() { return 0; }
|
||||||
|
virtual const VerilatedRange* rangep() { return 0; }
|
||||||
virtual vpiHandle dovpi_scan() { return 0; }
|
virtual vpiHandle dovpi_scan() { return 0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -112,6 +117,7 @@ public:
|
|||||||
}
|
}
|
||||||
virtual ~VerilatedVpioCb() {}
|
virtual ~VerilatedVpioCb() {}
|
||||||
static inline VerilatedVpioCb* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioCb*>((VerilatedVpio*)h); }
|
static inline VerilatedVpioCb* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioCb*>((VerilatedVpio*)h); }
|
||||||
|
virtual const vluint32_t type() { return vpiCallback; }
|
||||||
vluint32_t reason() const { return m_cbData.reason; }
|
vluint32_t reason() const { return m_cbData.reason; }
|
||||||
VerilatedPliCb cb_rtnp() const { return m_cbData.cb_rtn; }
|
VerilatedPliCb cb_rtnp() const { return m_cbData.cb_rtn; }
|
||||||
t_cb_data* cb_datap() { return &(m_cbData); }
|
t_cb_data* cb_datap() { return &(m_cbData); }
|
||||||
@@ -124,19 +130,20 @@ public:
|
|||||||
VerilatedVpioConst(vlsint32_t num) : m_num(num) {}
|
VerilatedVpioConst(vlsint32_t num) : m_num(num) {}
|
||||||
virtual ~VerilatedVpioConst() {}
|
virtual ~VerilatedVpioConst() {}
|
||||||
static inline VerilatedVpioConst* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioConst*>((VerilatedVpio*)h); }
|
static inline VerilatedVpioConst* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioConst*>((VerilatedVpio*)h); }
|
||||||
|
virtual const vluint32_t type() { return vpiUndefined; }
|
||||||
vlsint32_t num() const { return m_num; }
|
vlsint32_t num() const { return m_num; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class VerilatedVpioRange : public VerilatedVpio {
|
class VerilatedVpioRange : public VerilatedVpio {
|
||||||
vlsint32_t m_lhs; // Ranges can be signed
|
const VerilatedRange* m_range;
|
||||||
vlsint32_t m_rhs;
|
|
||||||
bool m_iteration;
|
bool m_iteration;
|
||||||
public:
|
public:
|
||||||
VerilatedVpioRange(vlsint32_t lhs, vlsint32_t rhs) : m_lhs(lhs), m_rhs(rhs), m_iteration(0) {}
|
VerilatedVpioRange(const VerilatedRange* range) : m_range(range), m_iteration(0) {}
|
||||||
virtual ~VerilatedVpioRange() {}
|
virtual ~VerilatedVpioRange() {}
|
||||||
static inline VerilatedVpioRange* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioRange*>((VerilatedVpio*)h); }
|
static inline VerilatedVpioRange* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioRange*>((VerilatedVpio*)h); }
|
||||||
vlsint32_t lhs() const { return m_lhs; }
|
virtual const vluint32_t type() { return vpiRange; }
|
||||||
vlsint32_t rhs() const { return m_rhs; }
|
virtual const vluint32_t size() const { return m_range->elements(); }
|
||||||
|
virtual const VerilatedRange* rangep() const { return m_range; }
|
||||||
int iteration() const { return m_iteration; }
|
int iteration() const { return m_iteration; }
|
||||||
void iterationInc() { ++m_iteration; }
|
void iterationInc() { ++m_iteration; }
|
||||||
virtual vpiHandle dovpi_scan() {
|
virtual vpiHandle dovpi_scan() {
|
||||||
@@ -157,6 +164,7 @@ public:
|
|||||||
: m_scopep(scopep) {}
|
: m_scopep(scopep) {}
|
||||||
virtual ~VerilatedVpioScope() {}
|
virtual ~VerilatedVpioScope() {}
|
||||||
static inline VerilatedVpioScope* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioScope*>((VerilatedVpio*)h); }
|
static inline VerilatedVpioScope* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioScope*>((VerilatedVpio*)h); }
|
||||||
|
virtual const vluint32_t type() { return vpiScope; }
|
||||||
const VerilatedScope* scopep() const { return m_scopep; }
|
const VerilatedScope* scopep() const { return m_scopep; }
|
||||||
virtual const char* name() { return m_scopep->name(); }
|
virtual const char* name() { return m_scopep->name(); }
|
||||||
virtual const char* fullname() { return m_scopep->name(); }
|
virtual const char* fullname() { return m_scopep->name(); }
|
||||||
@@ -174,11 +182,15 @@ class VerilatedVpioVar : public VerilatedVpio {
|
|||||||
protected:
|
protected:
|
||||||
void* m_varDatap; // varp()->datap() adjusted for array entries
|
void* m_varDatap; // varp()->datap() adjusted for array entries
|
||||||
vlsint32_t m_index;
|
vlsint32_t m_index;
|
||||||
|
const VerilatedRange& get_range() {
|
||||||
|
// Determine number of dimensions and return outermost
|
||||||
|
return (m_varp->dims()>1) ? m_varp->array() : m_varp->range();
|
||||||
|
}
|
||||||
public:
|
public:
|
||||||
VerilatedVpioVar(const VerilatedVar* varp, const VerilatedScope* scopep)
|
VerilatedVpioVar(const VerilatedVar* varp, const VerilatedScope* scopep)
|
||||||
: m_varp(varp), m_scopep(scopep), m_index(0) {
|
: m_varp(varp), m_scopep(scopep), m_index(0) {
|
||||||
m_prevDatap = NULL;
|
m_prevDatap = NULL;
|
||||||
m_mask.u32 = VL_MASK_I(varp->range().bits());
|
m_mask.u32 = VL_MASK_I(varp->range().elements());
|
||||||
m_entSize = varp->entSize();
|
m_entSize = varp->entSize();
|
||||||
m_varDatap = varp->datap();
|
m_varDatap = varp->datap();
|
||||||
}
|
}
|
||||||
@@ -191,6 +203,13 @@ public:
|
|||||||
vluint32_t mask() const { return m_mask.u32; }
|
vluint32_t mask() const { return m_mask.u32; }
|
||||||
vluint8_t mask_byte(int idx) { return m_mask.u8[idx & 3]; }
|
vluint8_t mask_byte(int idx) { return m_mask.u8[idx & 3]; }
|
||||||
vluint32_t entSize() const { return m_entSize; }
|
vluint32_t entSize() const { return m_entSize; }
|
||||||
|
const vluint32_t index() { return m_index; }
|
||||||
|
virtual const vluint32_t type() {
|
||||||
|
if (varp()->vldir() != vpiNoDirection) return vpiPort;
|
||||||
|
return (varp()->dims()>1) ? vpiMemory : vpiReg; /* but might be wire, logic */
|
||||||
|
}
|
||||||
|
virtual const vluint32_t size() { return get_range().elements(); }
|
||||||
|
virtual const VerilatedRange* rangep() { return &get_range(); }
|
||||||
virtual const char* name() { return m_varp->name(); }
|
virtual const char* name() { return m_varp->name(); }
|
||||||
virtual const char* fullname() {
|
virtual const char* fullname() {
|
||||||
VL_STATIC_OR_THREAD string out;
|
VL_STATIC_OR_THREAD string out;
|
||||||
@@ -207,16 +226,19 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class VerilatedVpioVarIndex : public VerilatedVpioVar {
|
class VerilatedVpioMemoryWord : public VerilatedVpioVar {
|
||||||
public:
|
public:
|
||||||
VerilatedVpioVarIndex(const VerilatedVar* varp, const VerilatedScope* scopep,
|
VerilatedVpioMemoryWord(const VerilatedVar* varp, const VerilatedScope* scopep,
|
||||||
vlsint32_t index, int offset)
|
vlsint32_t index, int offset)
|
||||||
: VerilatedVpioVar(varp, scopep) {
|
: VerilatedVpioVar(varp, scopep) {
|
||||||
m_index = index;
|
m_index = index;
|
||||||
m_varDatap = ((vluint8_t*)varp->datap()) + entSize()*offset;
|
m_varDatap = ((vluint8_t*)varp->datap()) + entSize()*offset;
|
||||||
}
|
}
|
||||||
virtual ~VerilatedVpioVarIndex() {}
|
virtual ~VerilatedVpioMemoryWord() {}
|
||||||
static inline VerilatedVpioVarIndex* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioVarIndex*>((VerilatedVpio*)h); }
|
static inline VerilatedVpioMemoryWord* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioMemoryWord*>((VerilatedVpio*)h); }
|
||||||
|
virtual const vluint32_t type() { return vpiMemoryWord; }
|
||||||
|
virtual const vluint32_t size() { return varp()->range().elements(); }
|
||||||
|
virtual const VerilatedRange* rangep() { return &(varp()->range()); }
|
||||||
virtual const char* fullname() {
|
virtual const char* fullname() {
|
||||||
VL_STATIC_OR_THREAD string out;
|
VL_STATIC_OR_THREAD string out;
|
||||||
char num[20]; sprintf(num,"%d",m_index);
|
char num[20]; sprintf(num,"%d",m_index);
|
||||||
@@ -234,6 +256,7 @@ public:
|
|||||||
: m_scopep(scopep), m_started(false) { }
|
: m_scopep(scopep), m_started(false) { }
|
||||||
virtual ~VerilatedVpioVarIter() {}
|
virtual ~VerilatedVpioVarIter() {}
|
||||||
static inline VerilatedVpioVarIter* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioVarIter*>((VerilatedVpio*)h); }
|
static inline VerilatedVpioVarIter* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioVarIter*>((VerilatedVpio*)h); }
|
||||||
|
virtual const vluint32_t type() { return vpiIterator; }
|
||||||
virtual vpiHandle dovpi_scan() {
|
virtual vpiHandle dovpi_scan() {
|
||||||
if (VL_LIKELY(m_scopep->varsp())) {
|
if (VL_LIKELY(m_scopep->varsp())) {
|
||||||
if (VL_UNLIKELY(!m_started)) { m_it = m_scopep->varsp()->begin(); m_started=true; }
|
if (VL_UNLIKELY(!m_started)) { m_it = m_scopep->varsp()->begin(); m_started=true; }
|
||||||
@@ -248,6 +271,28 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class VerilatedVpioMemoryWordIter : public VerilatedVpio {
|
||||||
|
const vpiHandle m_handle;
|
||||||
|
const VerilatedVar* m_varp;
|
||||||
|
vlsint32_t m_iteration;
|
||||||
|
vlsint32_t m_direction;
|
||||||
|
bool m_done;
|
||||||
|
public:
|
||||||
|
VerilatedVpioMemoryWordIter(const vpiHandle handle, const VerilatedVar* varp)
|
||||||
|
: m_handle(handle), m_varp(varp), m_iteration(varp->array().right()), m_direction(VL_LIKELY(varp->array().left()>varp->array().right())?1:-1), m_done(false) { }
|
||||||
|
virtual ~VerilatedVpioMemoryWordIter() {}
|
||||||
|
static inline VerilatedVpioMemoryWordIter* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioMemoryWordIter*>((VerilatedVpio*)h); }
|
||||||
|
virtual const vluint32_t type() { return vpiIterator; }
|
||||||
|
void iterationInc() { if (!(m_done = m_iteration == m_varp->array().left())) m_iteration+=m_direction; }
|
||||||
|
virtual vpiHandle dovpi_scan() {
|
||||||
|
vpiHandle result;
|
||||||
|
if (m_done) return 0;
|
||||||
|
result = vpi_handle_by_index(m_handle, m_iteration);
|
||||||
|
iterationInc();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//======================================================================
|
//======================================================================
|
||||||
|
|
||||||
struct VerilatedVpiTimedCbsCmp {
|
struct VerilatedVpiTimedCbsCmp {
|
||||||
@@ -260,14 +305,19 @@ struct VerilatedVpiTimedCbsCmp {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VerilatedVpiError;
|
class VerilatedVpiError;
|
||||||
|
|
||||||
class VerilatedVpi {
|
class VerilatedVpi {
|
||||||
enum { CB_ENUM_MAX_VALUE = cbAtEndOfSimTime+1 }; // Maxium callback reason
|
enum { CB_ENUM_MAX_VALUE = cbAtEndOfSimTime+1 }; // Maxium callback reason
|
||||||
typedef set<VerilatedVpioCb*> VpioCbSet;
|
typedef list<VerilatedVpioCb*> VpioCbList;
|
||||||
typedef set<pair<QData,VerilatedVpioCb*>,VerilatedVpiTimedCbsCmp > VpioTimedCbs;
|
typedef set<pair<QData,VerilatedVpioCb*>,VerilatedVpiTimedCbsCmp > VpioTimedCbs;
|
||||||
|
|
||||||
VpioCbSet m_cbObjSets[CB_ENUM_MAX_VALUE]; // Callbacks for each supported reason
|
struct product_info {
|
||||||
|
PLI_BYTE8* product;
|
||||||
|
PLI_BYTE8* version;
|
||||||
|
};
|
||||||
|
|
||||||
|
VpioCbList m_cbObjLists[CB_ENUM_MAX_VALUE]; // Callbacks for each supported reason
|
||||||
VpioTimedCbs m_timedCbs; // Time based callbacks
|
VpioTimedCbs m_timedCbs; // Time based callbacks
|
||||||
VerilatedVpiError* m_errorInfop; // Container for vpi error info
|
VerilatedVpiError* m_errorInfop; // Container for vpi error info
|
||||||
|
|
||||||
@@ -283,16 +333,17 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (VL_UNLIKELY(vop->reason() >= CB_ENUM_MAX_VALUE)) vl_fatal(__FILE__,__LINE__,"", "vpi bb reason too large");
|
if (VL_UNLIKELY(vop->reason() >= CB_ENUM_MAX_VALUE)) vl_fatal(__FILE__,__LINE__,"", "vpi bb reason too large");
|
||||||
s_s.m_cbObjSets[vop->reason()].insert(vop);
|
s_s.m_cbObjLists[vop->reason()].push_back(vop);
|
||||||
}
|
}
|
||||||
static void cbTimedAdd(VerilatedVpioCb* vop) {
|
static void cbTimedAdd(VerilatedVpioCb* vop) {
|
||||||
s_s.m_timedCbs.insert(make_pair(vop->time(), vop));
|
s_s.m_timedCbs.insert(make_pair(vop->time(), vop));
|
||||||
}
|
}
|
||||||
static void cbReasonRemove(VerilatedVpioCb* cbp) {
|
static void cbReasonRemove(VerilatedVpioCb* cbp) {
|
||||||
VpioCbSet& cbObjSet = s_s.m_cbObjSets[cbp->reason()];
|
VpioCbList& cbObjList = s_s.m_cbObjLists[cbp->reason()];
|
||||||
VpioCbSet::iterator it=cbObjSet.find(cbp);
|
// We do not remove it now as we may be iterating the list,
|
||||||
if (VL_LIKELY(it != cbObjSet.end())) {
|
// instead set to NULL and will cleanup later
|
||||||
cbObjSet.erase(it);
|
for (VpioCbList::iterator it=cbObjList.begin(); it!=cbObjList.end(); ++it) {
|
||||||
|
if (*it == cbp) *it = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void cbTimedRemove(VerilatedVpioCb* cbp) {
|
static void cbTimedRemove(VerilatedVpioCb* cbp) {
|
||||||
@@ -322,19 +373,26 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void callCbs(vluint32_t reason) {
|
static void callCbs(vluint32_t reason) {
|
||||||
VpioCbSet& cbObjSet = s_s.m_cbObjSets[reason];
|
VpioCbList& cbObjList = s_s.m_cbObjLists[reason];
|
||||||
for (VpioCbSet::iterator it=cbObjSet.begin(); it!=cbObjSet.end();) {
|
for (VpioCbList::iterator it=cbObjList.begin(); it!=cbObjList.end();) {
|
||||||
VerilatedVpioCb* vop = *it;
|
if (VL_UNLIKELY(!*it)) { // Deleted earlier, cleanup
|
||||||
++it; // iterator may be deleted by callback
|
it = cbObjList.erase(it);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
VerilatedVpioCb* vop = *it++;
|
||||||
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: reason_callback %d %p\n",reason,vop););
|
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: reason_callback %d %p\n",reason,vop););
|
||||||
(vop->cb_rtnp()) (vop->cb_datap());
|
(vop->cb_rtnp()) (vop->cb_datap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void callValueCbs() {
|
static void callValueCbs() {
|
||||||
VpioCbSet& cbObjSet = s_s.m_cbObjSets[cbValueChange];
|
VpioCbList& cbObjList = s_s.m_cbObjLists[cbValueChange];
|
||||||
for (VpioCbSet::iterator it=cbObjSet.begin(); it!=cbObjSet.end();) {
|
set<VerilatedVpioVar*> update; // set of objects to update after callbacks
|
||||||
VerilatedVpioCb* vop = *it;
|
for (VpioCbList::iterator it=cbObjList.begin(); it!=cbObjList.end();) {
|
||||||
++it; // iterator may be deleted by callback
|
if (VL_UNLIKELY(!*it)) { // Deleted earlier, cleanup
|
||||||
|
it = cbObjList.erase(it);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
VerilatedVpioCb* vop = *it++;
|
||||||
if (VerilatedVpioVar* varop = VerilatedVpioVar::castp(vop->cb_datap()->obj)) {
|
if (VerilatedVpioVar* varop = VerilatedVpioVar::castp(vop->cb_datap()->obj)) {
|
||||||
void* newDatap = varop->varDatap();
|
void* newDatap = varop->varDatap();
|
||||||
void* prevDatap = varop->prevDatap(); // Was malloced when we added the callback
|
void* prevDatap = varop->prevDatap(); // Was malloced when we added the callback
|
||||||
@@ -344,12 +402,15 @@ public:
|
|||||||
if (memcmp(prevDatap, newDatap, varop->entSize())) {
|
if (memcmp(prevDatap, newDatap, varop->entSize())) {
|
||||||
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: value_callback %p %s v[0]=%d\n",
|
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: value_callback %p %s v[0]=%d\n",
|
||||||
vop,varop->fullname(), *((CData*)newDatap)););
|
vop,varop->fullname(), *((CData*)newDatap)););
|
||||||
memcpy(prevDatap, newDatap, varop->entSize());
|
update.insert(varop);
|
||||||
vpi_get_value(vop->cb_datap()->obj, vop->cb_datap()->value);
|
vpi_get_value(vop->cb_datap()->obj, vop->cb_datap()->value);
|
||||||
(vop->cb_rtnp()) (vop->cb_datap());
|
(vop->cb_rtnp()) (vop->cb_datap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (set<VerilatedVpioVar*>::iterator it=update.begin(); it!=update.end(); it++ ) {
|
||||||
|
memcpy((*it)->prevDatap(), (*it)->varDatap(), (*it)->entSize());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static VerilatedVpiError* error_info(); // getter for vpi error info
|
static VerilatedVpiError* error_info(); // getter for vpi error info
|
||||||
@@ -545,15 +606,15 @@ vpiHandle vpi_handle_by_index(vpiHandle object, PLI_INT32 indx) {
|
|||||||
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
||||||
if (VL_LIKELY(varop)) {
|
if (VL_LIKELY(varop)) {
|
||||||
if (varop->varp()->dims()<2) return 0;
|
if (varop->varp()->dims()<2) return 0;
|
||||||
if (VL_LIKELY(varop->varp()->array().lhs() >= varop->varp()->array().rhs())) {
|
if (VL_LIKELY(varop->varp()->array().left() >= varop->varp()->array().right())) {
|
||||||
if (VL_UNLIKELY(indx > varop->varp()->array().lhs() || indx < varop->varp()->array().rhs())) return 0;
|
if (VL_UNLIKELY(indx > varop->varp()->array().left() || indx < varop->varp()->array().right())) return 0;
|
||||||
return (new VerilatedVpioVarIndex(varop->varp(), varop->scopep(), indx,
|
return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx,
|
||||||
indx - varop->varp()->array().rhs()))
|
indx - varop->varp()->array().right()))
|
||||||
->castVpiHandle();
|
->castVpiHandle();
|
||||||
} else {
|
} else {
|
||||||
if (VL_UNLIKELY(indx < varop->varp()->array().lhs() || indx > varop->varp()->array().rhs())) return 0;
|
if (VL_UNLIKELY(indx < varop->varp()->array().left() || indx > varop->varp()->array().right())) return 0;
|
||||||
return (new VerilatedVpioVarIndex(varop->varp(), varop->scopep(), indx,
|
return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx,
|
||||||
indx - varop->varp()->array().lhs()))
|
indx - varop->varp()->array().left()))
|
||||||
->castVpiHandle();
|
->castVpiHandle();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -568,21 +629,32 @@ vpiHandle vpi_handle(PLI_INT32 type, vpiHandle object) {
|
|||||||
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: vpi_handle %d %p\n",type,object););
|
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: vpi_handle %d %p\n",type,object););
|
||||||
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case vpiLeftRange: // FALLTHRU
|
case vpiLeftRange: {
|
||||||
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
|
if (VL_UNLIKELY(!vop->rangep())) return 0;
|
||||||
|
return (new VerilatedVpioConst(vop->rangep()->left()))->castVpiHandle();
|
||||||
|
}
|
||||||
case vpiRightRange: {
|
case vpiRightRange: {
|
||||||
if (VerilatedVpioVar* vop = VerilatedVpioVar::castp(object)) {
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
vluint32_t num = ((type==vpiLeftRange)
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
? vop->varp()->range().lhs()
|
if (VL_UNLIKELY(!vop->rangep())) return 0;
|
||||||
: vop->varp()->range().rhs());
|
return (new VerilatedVpioConst(vop->rangep()->right()))->castVpiHandle();
|
||||||
return (new VerilatedVpioConst(num))->castVpiHandle();
|
}
|
||||||
} else if (VerilatedVpioRange* vop = VerilatedVpioRange::castp(object)) {
|
case vpiIndex: {
|
||||||
vluint32_t num = ((type==vpiLeftRange)
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
? vop->lhs()
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
: vop->rhs());
|
return (new VerilatedVpioConst(vop->index()))->castVpiHandle();
|
||||||
return (new VerilatedVpioConst(num))->castVpiHandle();
|
}
|
||||||
} else {
|
case vpiScope: {
|
||||||
return 0;
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
}
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
|
return (new VerilatedVpioScope(vop->scopep()))->castVpiHandle();
|
||||||
|
}
|
||||||
|
case vpiParent: {
|
||||||
|
VerilatedVpioMemoryWord* vop = VerilatedVpioMemoryWord::castp(object);
|
||||||
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
|
return (new VerilatedVpioVar(vop->varp(), vop->scopep()))->castVpiHandle();
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
_VL_VPI_WARNING(__FILE__, __LINE__, "%s: Unsupported type %s, nothing will be returned",
|
_VL_VPI_WARNING(__FILE__, __LINE__, "%s: Unsupported type %s, nothing will be returned",
|
||||||
@@ -600,13 +672,25 @@ vpiHandle vpi_iterate(PLI_INT32 type, vpiHandle object) {
|
|||||||
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case vpiMemoryWord: {
|
case vpiMemoryWord: {
|
||||||
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
|
if (vop->varp()->dims() < 2) return 0;
|
||||||
|
if (vop->varp()->dims() > 2) {
|
||||||
|
_VL_VPI_WARNING(__FILE__, __LINE__, "%s: %s, object %s has unsupported number of indices (%d)",
|
||||||
|
VL_FUNC, VerilatedVpiError::strFromVpiMethod(type), vop->fullname() , vop->varp()->dims());
|
||||||
|
}
|
||||||
|
return (new VerilatedVpioMemoryWordIter(object, vop->varp()))->castVpiHandle();
|
||||||
|
}
|
||||||
|
case vpiRange: {
|
||||||
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
if (VL_UNLIKELY(!vop)) return 0;
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
if (vop->varp()->dims() < 2) return 0;
|
if (vop->varp()->dims() < 2) return 0;
|
||||||
// Unsupported is multidim list
|
// Unsupported is multidim list
|
||||||
return ((new VerilatedVpioRange(vop->varp()->array().lhs(),
|
if (vop->varp()->dims() > 2) {
|
||||||
vop->varp()->array().rhs()))
|
_VL_VPI_WARNING(__FILE__, __LINE__, "%s: %s, object %s has unsupported number of indices (%d)",
|
||||||
->castVpiHandle());
|
VL_FUNC, VerilatedVpiError::strFromVpiMethod(type), vop->fullname() , vop->varp()->dims());
|
||||||
|
}
|
||||||
|
return ((new VerilatedVpioRange(vop->rangep()))->castVpiHandle());
|
||||||
}
|
}
|
||||||
case vpiReg: {
|
case vpiReg: {
|
||||||
VerilatedVpioScope* vop = VerilatedVpioScope::castp(object);
|
VerilatedVpioScope* vop = VerilatedVpioScope::castp(object);
|
||||||
@@ -639,9 +723,9 @@ PLI_INT32 vpi_get(PLI_INT32 property, vpiHandle object) {
|
|||||||
return VL_TIME_PRECISION;
|
return VL_TIME_PRECISION;
|
||||||
}
|
}
|
||||||
case vpiType: {
|
case vpiType: {
|
||||||
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
VerilatedVpio* vop = VerilatedVpioVar::castp(object);
|
||||||
if (VL_UNLIKELY(!vop)) return 0;
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
return ((vop->varp()->dims()>1) ? vpiMemory : vpiReg);
|
return vop->type();
|
||||||
}
|
}
|
||||||
case vpiDirection: {
|
case vpiDirection: {
|
||||||
// By forthought, the directions already are vpi enumerated
|
// By forthought, the directions already are vpi enumerated
|
||||||
@@ -649,11 +733,16 @@ PLI_INT32 vpi_get(PLI_INT32 property, vpiHandle object) {
|
|||||||
if (VL_UNLIKELY(!vop)) return 0;
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
return vop->varp()->vldir();
|
return vop->varp()->vldir();
|
||||||
}
|
}
|
||||||
|
case vpiScalar: // FALLTHRU
|
||||||
case vpiVector: {
|
case vpiVector: {
|
||||||
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
if (VL_UNLIKELY(!vop)) return 0;
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
if (vop->varp()->dims()==0) return 0;
|
return (property==vpiVector)^(vop->varp()->dims()==0);
|
||||||
else return 1;
|
}
|
||||||
|
case vpiSize: {
|
||||||
|
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
|
||||||
|
if (VL_UNLIKELY(!vop)) return 0;
|
||||||
|
return vop->size();
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
_VL_VPI_WARNING(__FILE__, __LINE__, "%s: Unsupported type %s, nothing will be returned",
|
_VL_VPI_WARNING(__FILE__, __LINE__, "%s: Unsupported type %s, nothing will be returned",
|
||||||
@@ -730,7 +819,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
out[0].bval = 0;
|
out[0].bval = 0;
|
||||||
return;
|
return;
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int words = VL_WORDS_I(vop->varp()->range().bits());
|
int words = VL_WORDS_I(vop->varp()->range().elements());
|
||||||
if (VL_UNLIKELY(words >= VL_MULS_MAX_WORDS)) {
|
if (VL_UNLIKELY(words >= VL_MULS_MAX_WORDS)) {
|
||||||
vl_fatal(__FILE__,__LINE__,"", "vpi_get_value with more than VL_MULS_MAX_WORDS; increase and recompile");
|
vl_fatal(__FILE__,__LINE__,"", "vpi_get_value with more than VL_MULS_MAX_WORDS; increase and recompile");
|
||||||
}
|
}
|
||||||
@@ -763,7 +852,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int bits = vop->varp()->range().bits();
|
int bits = vop->varp()->range().elements();
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
int i;
|
int i;
|
||||||
if (bits > outStrSz) {
|
if (bits > outStrSz) {
|
||||||
@@ -792,8 +881,8 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int chars = (vop->varp()->range().bits()+2)/3;
|
int chars = (vop->varp()->range().elements()+2)/3;
|
||||||
int bytes = VL_BYTES_I(vop->varp()->range().bits());
|
int bytes = VL_BYTES_I(vop->varp()->range().elements());
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
int i;
|
int i;
|
||||||
if (chars > outStrSz) {
|
if (chars > outStrSz) {
|
||||||
@@ -815,7 +904,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
if (i==(chars-1)) {
|
if (i==(chars-1)) {
|
||||||
// most signifcant char, mask off non existant bits when vector
|
// most signifcant char, mask off non existant bits when vector
|
||||||
// size is not a multiple of 3
|
// size is not a multiple of 3
|
||||||
unsigned int rem = vop->varp()->range().bits() % 3;
|
unsigned int rem = vop->varp()->range().elements() % 3;
|
||||||
if (rem) {
|
if (rem) {
|
||||||
// generate bit mask & zero non existant bits
|
// generate bit mask & zero non existant bits
|
||||||
val &= (1<<rem)-1;
|
val &= (1<<rem)-1;
|
||||||
@@ -839,7 +928,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
case VLVT_UINT8 : snprintf(outStr, outStrSz+1, "%hhu", (unsigned int)*((CData*)(vop->varDatap()))); return;
|
case VLVT_UINT8 : snprintf(outStr, outStrSz+1, "%hhu", (unsigned int)*((CData*)(vop->varDatap()))); return;
|
||||||
case VLVT_UINT16: snprintf(outStr, outStrSz+1, "%hu", (unsigned int)*((SData*)(vop->varDatap()))); return;
|
case VLVT_UINT16: snprintf(outStr, outStrSz+1, "%hu", (unsigned int)*((SData*)(vop->varDatap()))); return;
|
||||||
case VLVT_UINT32: snprintf(outStr, outStrSz+1, "%u", (unsigned int)*((IData*)(vop->varDatap()))); return;
|
case VLVT_UINT32: snprintf(outStr, outStrSz+1, "%u", (unsigned int)*((IData*)(vop->varDatap()))); return;
|
||||||
case VLVT_UINT64: snprintf(outStr, outStrSz+1, "%lu", (unsigned long)*((QData*)(vop->varDatap()))); return;
|
case VLVT_UINT64: snprintf(outStr, outStrSz+1, "%llu", (unsigned long long)*((QData*)(vop->varDatap()))); return;
|
||||||
default:
|
default:
|
||||||
strcpy(outStr, "-1");
|
strcpy(outStr, "-1");
|
||||||
_VL_VPI_ERROR(__FILE__, __LINE__, "%s: Unsupported format (%s) for %s, maximum limit is 64 bits",
|
_VL_VPI_ERROR(__FILE__, __LINE__, "%s: Unsupported format (%s) for %s, maximum limit is 64 bits",
|
||||||
@@ -854,7 +943,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int chars = (vop->varp()->range().bits()+3)>>2;
|
int chars = (vop->varp()->range().elements()+3)>>2;
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
int i;
|
int i;
|
||||||
if (chars > outStrSz) {
|
if (chars > outStrSz) {
|
||||||
@@ -869,7 +958,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
if (i==(chars-1)) {
|
if (i==(chars-1)) {
|
||||||
// most signifcant char, mask off non existant bits when vector
|
// most signifcant char, mask off non existant bits when vector
|
||||||
// size is not a multiple of 4
|
// size is not a multiple of 4
|
||||||
unsigned int rem = vop->varp()->range().bits() & 3;
|
unsigned int rem = vop->varp()->range().elements() & 3;
|
||||||
if (rem) {
|
if (rem) {
|
||||||
// generate bit mask & zero non existant bits
|
// generate bit mask & zero non existant bits
|
||||||
val &= (1<<rem)-1;
|
val &= (1<<rem)-1;
|
||||||
@@ -893,7 +982,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int bytes = VL_BYTES_I(vop->varp()->range().bits());
|
int bytes = VL_BYTES_I(vop->varp()->range().elements());
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
int i;
|
int i;
|
||||||
if (bytes > outStrSz) {
|
if (bytes > outStrSz) {
|
||||||
@@ -936,6 +1025,8 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
VL_FUNC, VerilatedVpiError::strFromVpiVal(value_p->format), vop->fullname());
|
VL_FUNC, VerilatedVpiError::strFromVpiVal(value_p->format), vop->fullname());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else if (value_p->format == vpiSuppressVal) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
_VL_VPI_ERROR(__FILE__, __LINE__, "%s: Unsupported format (%s) as requested for %s",
|
_VL_VPI_ERROR(__FILE__, __LINE__, "%s: Unsupported format (%s) as requested for %s",
|
||||||
VL_FUNC, VerilatedVpiError::strFromVpiVal(value_p->format), vop->fullname());
|
VL_FUNC, VerilatedVpiError::strFromVpiVal(value_p->format), vop->fullname());
|
||||||
@@ -984,7 +1075,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
|
|||||||
*((IData*)(vop->varDatap())) = value_p->value.vector[0].aval & vop->mask();
|
*((IData*)(vop->varDatap())) = value_p->value.vector[0].aval & vop->mask();
|
||||||
return object;
|
return object;
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int words = VL_WORDS_I(vop->varp()->range().bits());
|
int words = VL_WORDS_I(vop->varp()->range().elements());
|
||||||
WDataOutP datap = ((IData*)(vop->varDatap()));
|
WDataOutP datap = ((IData*)(vop->varDatap()));
|
||||||
for (int i=0; i<words; i++) {
|
for (int i=0; i<words; i++) {
|
||||||
datap[i] = value_p->value.vector[i].aval;
|
datap[i] = value_p->value.vector[i].aval;
|
||||||
@@ -1013,7 +1104,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int bits = vop->varp()->range().bits();
|
int bits = vop->varp()->range().elements();
|
||||||
int len = strlen(value_p->value.str);
|
int len = strlen(value_p->value.str);
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
for (int i=0; i<bits; i++) {
|
for (int i=0; i<bits; i++) {
|
||||||
@@ -1040,8 +1131,8 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int chars = (vop->varp()->range().bits()+2)/3;
|
int chars = (vop->varp()->range().elements()+2)/3;
|
||||||
int bytes = VL_BYTES_I(vop->varp()->range().bits());
|
int bytes = VL_BYTES_I(vop->varp()->range().elements());
|
||||||
int len = strlen(value_p->value.str);
|
int len = strlen(value_p->value.str);
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
div_t idx;
|
div_t idx;
|
||||||
@@ -1096,8 +1187,8 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
|
|||||||
}
|
}
|
||||||
} else if (value_p->format == vpiDecStrVal) {
|
} else if (value_p->format == vpiDecStrVal) {
|
||||||
char remainder[16];
|
char remainder[16];
|
||||||
unsigned long val;
|
unsigned long long val;
|
||||||
int success = sscanf(value_p->value.str, "%30lu%15s", &val, remainder);
|
int success = sscanf(value_p->value.str, "%30llu%15s", &val, remainder);
|
||||||
if (success < 1) {
|
if (success < 1) {
|
||||||
_VL_VPI_ERROR(__FILE__, __LINE__, "%s: Parsing failed for '%s' as value %s for %s",
|
_VL_VPI_ERROR(__FILE__, __LINE__, "%s: Parsing failed for '%s' as value %s for %s",
|
||||||
VL_FUNC, value_p->value.str, VerilatedVpiError::strFromVpiVal(value_p->format), vop->fullname());
|
VL_FUNC, value_p->value.str, VerilatedVpiError::strFromVpiVal(value_p->format), vop->fullname());
|
||||||
@@ -1126,7 +1217,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int chars = (vop->varp()->range().bits()+3)>>2;
|
int chars = (vop->varp()->range().elements()+3)>>2;
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
char* val = value_p->value.str;
|
char* val = value_p->value.str;
|
||||||
// skip hex ident if one is detected at the start of the string
|
// skip hex ident if one is detected at the start of the string
|
||||||
@@ -1173,7 +1264,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
|
|||||||
case VLVT_UINT32:
|
case VLVT_UINT32:
|
||||||
case VLVT_UINT64:
|
case VLVT_UINT64:
|
||||||
case VLVT_WDATA: {
|
case VLVT_WDATA: {
|
||||||
int bytes = VL_BYTES_I(vop->varp()->range().bits());
|
int bytes = VL_BYTES_I(vop->varp()->range().elements());
|
||||||
int len = strlen(value_p->value.str);
|
int len = strlen(value_p->value.str);
|
||||||
CData* datap = ((CData*)(vop->varDatap()));
|
CData* datap = ((CData*)(vop->varDatap()));
|
||||||
for (int i=0; i<bytes; i++) {
|
for (int i=0; i<bytes; i++) {
|
||||||
@@ -1227,7 +1318,21 @@ void vpi_put_value_array(vpiHandle object, p_vpi_arrayvalue arrayvalue_p,
|
|||||||
// time processing
|
// time processing
|
||||||
|
|
||||||
void vpi_get_time(vpiHandle object, p_vpi_time time_p) {
|
void vpi_get_time(vpiHandle object, p_vpi_time time_p) {
|
||||||
_VL_VPI_UNIMP(); return;
|
if (VL_UNLIKELY(!time_p)) {
|
||||||
|
_VL_VPI_WARNING(__FILE__, __LINE__, "Ignoring vpi_get_time with NULL value pointer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (time_p->type == vpiSimTime) {
|
||||||
|
QData qtime = VL_TIME_Q();
|
||||||
|
IData itime[2];
|
||||||
|
VL_SET_WQ(itime, qtime);
|
||||||
|
time_p->low = itime[0];
|
||||||
|
time_p->high = itime[1];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_VL_VPI_ERROR(__FILE__, __LINE__, "%s: Unsupported type (%d)",
|
||||||
|
VL_FUNC, time_p->type);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// I/O routines
|
// I/O routines
|
||||||
|
|||||||
+10
-1
@@ -1,7 +1,7 @@
|
|||||||
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
// -*- mode: C++; c-file-style: "cc-mode" -*-
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License.
|
// Lesser General Public License Version 3 or the Perl Artistic License.
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -189,6 +189,15 @@ typedef unsigned long long vluint64_t; ///< 64-bit unsigned type
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//=========================================================================
|
||||||
|
// File system functions
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# define VL_DEV_NULL "nul"
|
||||||
|
#else // Linux or compliant Unix flavors
|
||||||
|
# define VL_DEV_NULL "/dev/null"
|
||||||
|
#endif
|
||||||
|
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
// Integer size macros
|
// Integer size macros
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
* This file contains the constant definitions, structure definitions,
|
* This file contains the constant definitions, structure definitions,
|
||||||
* and routine declarations used by SystemVerilog DPI.
|
* and routine declarations used by SystemVerilog DPI.
|
||||||
*
|
*
|
||||||
* This file is from the SystemVerilog IEEE 1800-2009 Annex I.
|
* This file is from the SystemVerilog IEEE 1800-2012 Annex I.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef INCLUDED_SVDPI
|
#ifndef INCLUDED_SVDPI
|
||||||
@@ -35,18 +35,18 @@ typedef signed __int8 int8_t;
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Use to export a symbol from application */
|
/* Use to import a symbol into dll */
|
||||||
#ifndef DPI_DLLISPEC
|
#ifndef DPI_DLLISPEC
|
||||||
#if defined (_MSC_VER)
|
#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
|
||||||
#define DPI_DLLISPEC __declspec(dllimport)
|
#define DPI_DLLISPEC __declspec(dllimport)
|
||||||
#else
|
#else
|
||||||
#define DPI_DLLISPEC
|
#define DPI_DLLISPEC
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Use to import a symbol into application */
|
/* Use to export a symbol from dll */
|
||||||
#ifndef DPI_DLLESPEC
|
#ifndef DPI_DLLESPEC
|
||||||
#if defined (_MSC_VER)
|
#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
|
||||||
#define DPI_DLLESPEC __declspec(dllexport)
|
#define DPI_DLLESPEC __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define DPI_DLLESPEC
|
#define DPI_DLLESPEC
|
||||||
|
|||||||
+21
-21
@@ -1,7 +1,7 @@
|
|||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* vpi_user.h
|
* vpi_user.h
|
||||||
*
|
*
|
||||||
* IEEE Std 1800 Programming Language Interface (PLI)
|
* IEEE Std 1800-2012 Programming Language Interface (PLI)
|
||||||
*
|
*
|
||||||
* This file contains the constant definitions, structure definitions, and
|
* This file contains the constant definitions, structure definitions, and
|
||||||
* routine declarations used by the SystemVerilog Verification Procedural
|
* routine declarations used by the SystemVerilog Verification Procedural
|
||||||
@@ -61,9 +61,9 @@ typedef char PLI_BYTE8;
|
|||||||
typedef unsigned char PLI_UBYTE8;
|
typedef unsigned char PLI_UBYTE8;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Use to export a symbol */
|
/* Use to import a symbol */
|
||||||
|
|
||||||
#if WIN32
|
#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
|
||||||
#ifndef PLI_DLLISPEC
|
#ifndef PLI_DLLISPEC
|
||||||
#define PLI_DLLISPEC __declspec(dllimport)
|
#define PLI_DLLISPEC __declspec(dllimport)
|
||||||
#define VPI_USER_DEFINED_DLLISPEC 1
|
#define VPI_USER_DEFINED_DLLISPEC 1
|
||||||
@@ -74,9 +74,9 @@ typedef unsigned char PLI_UBYTE8;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Use to import a symbol */
|
/* Use to export a symbol */
|
||||||
|
|
||||||
#if WIN32
|
#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
|
||||||
#ifndef PLI_DLLESPEC
|
#ifndef PLI_DLLESPEC
|
||||||
#define PLI_DLLESPEC __declspec(dllexport)
|
#define PLI_DLLESPEC __declspec(dllexport)
|
||||||
#define VPI_USER_DEFINED_DLLESPEC 1
|
#define VPI_USER_DEFINED_DLLESPEC 1
|
||||||
@@ -438,12 +438,12 @@ typedef PLI_UINT32 *vpiHandle;
|
|||||||
#define vpiPlusOp 2 /* unary plus */
|
#define vpiPlusOp 2 /* unary plus */
|
||||||
#define vpiNotOp 3 /* unary not */
|
#define vpiNotOp 3 /* unary not */
|
||||||
#define vpiBitNegOp 4 /* bitwise negation */
|
#define vpiBitNegOp 4 /* bitwise negation */
|
||||||
#define vpiUnaryAndOp 5 /* bitwise reduction and */
|
#define vpiUnaryAndOp 5 /* bitwise reduction AND */
|
||||||
#define vpiUnaryNandOp 6 /* bitwise reduction nand */
|
#define vpiUnaryNandOp 6 /* bitwise reduction NAND */
|
||||||
#define vpiUnaryOrOp 7 /* bitwise reduction or */
|
#define vpiUnaryOrOp 7 /* bitwise reduction OR */
|
||||||
#define vpiUnaryNorOp 8 /* bitwise reduction nor */
|
#define vpiUnaryNorOp 8 /* bitwise reduction NOR */
|
||||||
#define vpiUnaryXorOp 9 /* bitwise reduction xor */
|
#define vpiUnaryXorOp 9 /* bitwise reduction XOR */
|
||||||
#define vpiUnaryXNorOp 10 /* bitwise reduction xnor */
|
#define vpiUnaryXNorOp 10 /* bitwise reduction XNOR */
|
||||||
#define vpiSubOp 11 /* binary subtraction */
|
#define vpiSubOp 11 /* binary subtraction */
|
||||||
#define vpiDivOp 12 /* binary division */
|
#define vpiDivOp 12 /* binary division */
|
||||||
#define vpiModOp 13 /* binary modulus */
|
#define vpiModOp 13 /* binary modulus */
|
||||||
@@ -459,17 +459,17 @@ typedef PLI_UINT32 *vpiHandle;
|
|||||||
#define vpiRShiftOp 23 /* binary right shift */
|
#define vpiRShiftOp 23 /* binary right shift */
|
||||||
#define vpiAddOp 24 /* binary addition */
|
#define vpiAddOp 24 /* binary addition */
|
||||||
#define vpiMultOp 25 /* binary multiplication */
|
#define vpiMultOp 25 /* binary multiplication */
|
||||||
#define vpiLogAndOp 26 /* binary logical and */
|
#define vpiLogAndOp 26 /* binary logical AND */
|
||||||
#define vpiLogOrOp 27 /* binary logical or */
|
#define vpiLogOrOp 27 /* binary logical OR */
|
||||||
#define vpiBitAndOp 28 /* binary bitwise and */
|
#define vpiBitAndOp 28 /* binary bitwise AND */
|
||||||
#define vpiBitOrOp 29 /* binary bitwise or */
|
#define vpiBitOrOp 29 /* binary bitwise OR */
|
||||||
#define vpiBitXorOp 30 /* binary bitwise xor */
|
#define vpiBitXorOp 30 /* binary bitwise XOR */
|
||||||
#define vpiBitXNorOp 31 /* binary bitwise xnor */
|
#define vpiBitXNorOp 31 /* binary bitwise XNOR */
|
||||||
#define vpiBitXnorOp vpiBitXNorOp /* added with 1364-2001 */
|
#define vpiBitXnorOp vpiBitXNorOp /* added with 1364-2001 */
|
||||||
#define vpiConditionOp 32 /* ternary conditional */
|
#define vpiConditionOp 32 /* ternary conditional */
|
||||||
#define vpiConcatOp 33 /* n-ary concatenation */
|
#define vpiConcatOp 33 /* n-ary concatenation */
|
||||||
#define vpiMultiConcatOp 34 /* repeated concatenation */
|
#define vpiMultiConcatOp 34 /* repeated concatenation */
|
||||||
#define vpiEventOrOp 35 /* event or */
|
#define vpiEventOrOp 35 /* event OR */
|
||||||
#define vpiNullOp 36 /* null operation */
|
#define vpiNullOp 36 /* null operation */
|
||||||
#define vpiListOp 37 /* list of expressions */
|
#define vpiListOp 37 /* list of expressions */
|
||||||
#define vpiMinTypMaxOp 38 /* min:typ:max: delay expression */
|
#define vpiMinTypMaxOp 38 /* min:typ:max: delay expression */
|
||||||
@@ -536,7 +536,7 @@ typedef PLI_UINT32 *vpiHandle;
|
|||||||
same subtypes as vpiNetType */
|
same subtypes as vpiNetType */
|
||||||
#define vpiSaveRestartID 62 /* unique ID for save/restart data */
|
#define vpiSaveRestartID 62 /* unique ID for save/restart data */
|
||||||
#define vpiSaveRestartLocation 63 /* name of save/restart data file */
|
#define vpiSaveRestartLocation 63 /* name of save/restart data file */
|
||||||
/* vpiValid,vpiValidTrue,vpiValidFalse are deprecated in 1800-2009 */
|
/* vpiValid,vpiValidTrue,vpiValidFalse were deprecated in 1800-2009 */
|
||||||
#define vpiValid 64 /* reentrant task/func frame or automatic
|
#define vpiValid 64 /* reentrant task/func frame or automatic
|
||||||
variable is valid */
|
variable is valid */
|
||||||
#define vpiValidFalse 0
|
#define vpiValidFalse 0
|
||||||
@@ -661,7 +661,7 @@ typedef struct t_vpi_arrayvalue
|
|||||||
{
|
{
|
||||||
PLI_INT32 *integers; /* integer values */
|
PLI_INT32 *integers; /* integer values */
|
||||||
PLI_INT16 *shortints; /* short integer values */
|
PLI_INT16 *shortints; /* short integer values */
|
||||||
PLI_INT16 *longints; /* long integer values */
|
PLI_INT64 *longints; /* long integer values */
|
||||||
PLI_BYTE8 *rawvals; /* 2/4-state vector elements */
|
PLI_BYTE8 *rawvals; /* 2/4-state vector elements */
|
||||||
struct t_vpi_vecval *vectors; /* 4-state vector elements */
|
struct t_vpi_vecval *vectors; /* 4-state vector elements */
|
||||||
struct t_vpi_time *times; /* time values */
|
struct t_vpi_time *times; /* time values */
|
||||||
@@ -944,7 +944,7 @@ XXTERN PLI_INT32 vpi_compare_objects PROTO_PARAMS((vpiHandle object1,
|
|||||||
vpiHandle object2));
|
vpiHandle object2));
|
||||||
XXTERN PLI_INT32 vpi_chk_error PROTO_PARAMS((p_vpi_error_info
|
XXTERN PLI_INT32 vpi_chk_error PROTO_PARAMS((p_vpi_error_info
|
||||||
error_info_p));
|
error_info_p));
|
||||||
/* vpi_free_object() is deprecated in 1800-2009 */
|
/* vpi_free_object() was deprecated in 1800-2009 */
|
||||||
XXTERN PLI_INT32 vpi_free_object PROTO_PARAMS((vpiHandle object));
|
XXTERN PLI_INT32 vpi_free_object PROTO_PARAMS((vpiHandle object));
|
||||||
XXTERN PLI_INT32 vpi_release_handle PROTO_PARAMS((vpiHandle object));
|
XXTERN PLI_INT32 vpi_release_handle PROTO_PARAMS((vpiHandle object));
|
||||||
XXTERN PLI_INT32 vpi_get_vlog_info PROTO_PARAMS((p_vpi_vlog_info
|
XXTERN PLI_INT32 vpi_get_vlog_info PROTO_PARAMS((p_vpi_vlog_info
|
||||||
|
|||||||
+57
-6
@@ -366,10 +366,8 @@ AST.
|
|||||||
|
|
||||||
=head1 TESTING
|
=head1 TESTING
|
||||||
|
|
||||||
To write a test see the BUGS section of the Verilator primary manual, and
|
For an overview of how to write a test see the BUGS section of the
|
||||||
the documentation in:
|
Verilator primary manual.
|
||||||
|
|
||||||
test_regress/t/driver.pl --help
|
|
||||||
|
|
||||||
It is important to add tests for failures as well as success (for example to
|
It is important to add tests for failures as well as success (for example to
|
||||||
check that an error message is correctly triggered).
|
check that an error message is correctly triggered).
|
||||||
@@ -378,7 +376,60 @@ Tests that fail should by convenition have the suffix C<_bad> in their name,
|
|||||||
and include C<fails =E<gt> 1> in either their C<compile> or C<execute> step as
|
and include C<fails =E<gt> 1> in either their C<compile> or C<execute> step as
|
||||||
appropriate.
|
appropriate.
|
||||||
|
|
||||||
Developers will also want to configure with two extra flags:
|
=head2 Controlling the Test Driver
|
||||||
|
|
||||||
|
Test drivers are written in PERL. All invoke the main test driver script,
|
||||||
|
which can provide detailed help on all the features available when writing
|
||||||
|
a test driver.
|
||||||
|
|
||||||
|
test_regress/t/driver.pl --help
|
||||||
|
|
||||||
|
For convenience, a summary of the most commonly used features is provided
|
||||||
|
here. All drivers require a call to C<compile> subroutine to compile the
|
||||||
|
test. For run-time tests, this is followed by a call to the C<execute>
|
||||||
|
subroutine. Both of these functions can optionally be provided with a hash
|
||||||
|
table as argument specifying additonal options.
|
||||||
|
|
||||||
|
The test driver assumes by default that the source Verilog file name
|
||||||
|
matches the PERL driver name. So a test whose driver is C<t/t_mytest.pl>
|
||||||
|
will expect a Verilog source file C<t/t_mytest.v>. This can be changed
|
||||||
|
using the C<top_filename> subroutine, for example
|
||||||
|
|
||||||
|
top_filename("t/t_myothertest.v");
|
||||||
|
|
||||||
|
By default all tests will run with major simulators (Icarus Verilog, NC,
|
||||||
|
VCS, ModelSim) as well as Verilator, to allow results to be
|
||||||
|
compared. However if you wish a test only to be used with Verilator, you
|
||||||
|
can use the following:
|
||||||
|
|
||||||
|
$Self->{vlt} or $Self->skip("Verilator only test");
|
||||||
|
|
||||||
|
Of the many options that can be set through arguments to C<compiler> and
|
||||||
|
C<execute>, the following are particularly useful:
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item C<verilator_flags2>
|
||||||
|
|
||||||
|
A list of flags to be passed to verilator when compiling.
|
||||||
|
|
||||||
|
=item C<fails>
|
||||||
|
|
||||||
|
Set to 1 to indicate that the compilation or execution is intended to fail.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
For example the following would specify that compilation requires two
|
||||||
|
defines and is expected to fail.
|
||||||
|
|
||||||
|
compile (
|
||||||
|
verilator_flags2 => ["-DSMALL_CLOCK -DGATED_COMMENT"],
|
||||||
|
fails => 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
=head2 Regression Testing for Developers
|
||||||
|
|
||||||
|
Developers will also want to call ./configure with two extra flags:
|
||||||
|
|
||||||
=over 4
|
=over 4
|
||||||
|
|
||||||
@@ -697,7 +748,7 @@ in C<src/Makefile_obj.in> and reconfigure.
|
|||||||
|
|
||||||
The latest version is available from L<http://www.veripool.org/>.
|
The latest version is available from L<http://www.veripool.org/>.
|
||||||
|
|
||||||
Copyright 2008-2013 by Wilson Snyder. Verilator is free software; you can
|
Copyright 2008-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
redistribute it and/or modify it under the terms of either the GNU Lesser
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
######################################################################
|
######################################################################
|
||||||
#
|
#
|
||||||
# Copyright 2007-2013 by Wilson Snyder. This package is free software; you
|
# Copyright 2007-2014 by Wilson Snyder. This package is free software; you
|
||||||
# can redistribute it and/or modify it under the terms of either the GNU
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
######################################################################
|
######################################################################
|
||||||
#
|
#
|
||||||
# Copyright 2007-2013 by Wilson Snyder. This package is free software; you
|
# Copyright 2007-2014 by Wilson Snyder. This package is free software; you
|
||||||
# can redistribute it and/or modify it under the terms of either the GNU
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -143,7 +143,7 @@ Displays this message and program version and exits.
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2005-2013 by Wilson Snyder. Verilator is free software; you can
|
Copyright 2005-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
redistribute it and/or modify it under the terms of either the GNU Lesser
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -184,7 +184,7 @@ Displays this message and program version and exits.
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2005-2013 by Wilson Snyder. Verilator is free software; you can
|
Copyright 2005-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
redistribute it and/or modify it under the terms of either the GNU Lesser
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
######################################################################
|
######################################################################
|
||||||
#
|
#
|
||||||
# Copyright 2007-2013 by Wilson Snyder. This package is free software; you
|
# Copyright 2007-2014 by Wilson Snyder. This package is free software; you
|
||||||
# can redistribute it and/or modify it under the terms of either the GNU
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -183,7 +183,7 @@ Runs a specific test stage (see the script).
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2009-2013 by Wilson Snyder. This package is free software; you
|
Copyright 2009-2014 by Wilson Snyder. This package is free software; you
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
can redistribute it and/or modify it under the terms of either the GNU
|
||||||
Lesser General Public License Version 3 or the Perl Artistic License
|
Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
Version 2.0.
|
Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -28,7 +28,7 @@ invoke_atsim - Invoke tool under "modules" command
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2005-2013 by Wilson Snyder. This package is free software; you
|
Copyright 2005-2014 by Wilson Snyder. This package is free software; you
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
can redistribute it and/or modify it under the terms of either the GNU
|
||||||
Lesser General Public License Version 3 or the Perl Artistic License
|
Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
Version 2.0.
|
Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -28,7 +28,7 @@ invoke_iccr - Invoke tool under "modules" command
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2007-2013 by Wilson Snyder. This package is free software; you
|
Copyright 2007-2014 by Wilson Snyder. This package is free software; you
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
can redistribute it and/or modify it under the terms of either the GNU
|
||||||
Lesser General Public License Version 3 or the Perl Artistic License
|
Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
Version 2.0.
|
Version 2.0.
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ invoke_ncverilog - Invoke tool under "modules" command
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2005-2013 by Wilson Snyder. This package is free software; you
|
Copyright 2005-2014 by Wilson Snyder. This package is free software; you
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
can redistribute it and/or modify it under the terms of either the GNU
|
||||||
Lesser General Public License Version 3 or the Perl Artistic License
|
Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
Version 2.0.
|
Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -28,7 +28,7 @@ invoke_vcs - Invoke tool under "modules" command
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2005-2013 by Wilson Snyder. This package is free software; you
|
Copyright 2005-2014 by Wilson Snyder. This package is free software; you
|
||||||
can redistribute it and/or modify it under the terms of either the GNU
|
can redistribute it and/or modify it under the terms of either the GNU
|
||||||
Lesser General Public License Version 3 or the Perl Artistic License
|
Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
Version 2.0.
|
Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
######################################################################
|
######################################################################
|
||||||
#
|
#
|
||||||
# Copyright 2010-2013 by Wilson Snyder. This package is free software; you
|
# Copyright 2010-2014 by Wilson Snyder. This package is free software; you
|
||||||
# can redistribute it and/or modify it under the terms of either the GNU
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|||||||
@@ -331,7 +331,7 @@ Displays this message and program version and exits.
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
Copyright 2005-2013 by Wilson Snyder. Verilator is free software; you can
|
Copyright 2005-2014 by Wilson Snyder. Verilator is free software; you can
|
||||||
redistribute it and/or modify it under the terms of either the GNU Lesser
|
redistribute it and/or modify it under the terms of either the GNU Lesser
|
||||||
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
General Public License Version 3 or the Perl Artistic License Version 2.0.
|
||||||
|
|
||||||
|
|||||||
+20
-24
@@ -9,7 +9,7 @@ This is the Verilator Package README file.
|
|||||||
|
|
||||||
=head1 DISTRIBUTION
|
=head1 DISTRIBUTION
|
||||||
|
|
||||||
This package is Copyright 2003-2013 by Wilson Snyder. (Report bugs to
|
This package is Copyright 2003-2014 by Wilson Snyder. (Report bugs to
|
||||||
L<http://www.veripool.org/>.)
|
L<http://www.veripool.org/>.)
|
||||||
|
|
||||||
Verilator is free software; you can redistribute it and/or modify it under
|
Verilator is free software; you can redistribute it and/or modify it under
|
||||||
@@ -24,14 +24,14 @@ more details.
|
|||||||
|
|
||||||
=head1 DESCRIPTION
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
Verilator converts synthesizable (not behavioral) Verilog code into C++ or
|
Verilator converts synthesizable (generally not behavioral) Verilog code
|
||||||
SystemC code. It is not a complete simulator, just a translator.
|
into C++ or SystemC code. It is not a complete simulator, just a
|
||||||
|
translator.
|
||||||
|
|
||||||
Verilator is invoked with parameters similar to GCC or Synopsys's VCS. It
|
Verilator is invoked with parameters similar to GCC or Synopsys's VCS. It
|
||||||
reads the specified Verilog code, lints it, and optionally adds coverage
|
reads the specified Verilog code, lints it, and optionally adds coverage
|
||||||
code. For C++ format, it outputs .cpp and .h files. For SystemC format,
|
code. For C++ format, it outputs .cpp and .h files. For SystemC format,
|
||||||
it outputs .sp files for the SystemPerl preprocessor available at
|
it outputs .cpp and .h files using the standard SystemC headers.
|
||||||
http://www.veripool.org.
|
|
||||||
|
|
||||||
The resulting files are then compiled with C++. The user writes a little
|
The resulting files are then compiled with C++. The user writes a little
|
||||||
C++ wrapper file, which instantiates the top level module. This is
|
C++ wrapper file, which instantiates the top level module. This is
|
||||||
@@ -41,14 +41,11 @@ The resulting executable will perform the actual simulation.
|
|||||||
|
|
||||||
=head1 SUPPORTED SYSTEMS
|
=head1 SUPPORTED SYSTEMS
|
||||||
|
|
||||||
Verilator is developed and has primary testing on:
|
Verilator is developed and has primary testing on Ubuntu. Versions have
|
||||||
|
also built on Redhat Linux, Macs OS-X, HPUX and Solaris. It should run
|
||||||
SuSE 11.1 AMD64 i686-linux-2.6.27, GCC 4.3.2
|
with minor porting on any Linix-ish platform. Verilator also works on
|
||||||
|
Windows under Cygwin, and Windows under MinGW (gcc -mno-cygwin). Verilated
|
||||||
Versions have also built on Redhat Linux, Macs OS-X, HPUX and Solaris. It
|
output (not Verilator itself) compiles under MSVC++ 2008 and newer.
|
||||||
should run with minor porting on any Linix-ish platform. Verilator also
|
|
||||||
works on Windows under Cygwin, and Windows under MinGW (gcc -mno-cygwin).
|
|
||||||
Verilated output (not Verilator itself) compiles under MSVC++ 2008.
|
|
||||||
|
|
||||||
=head1 INSTALLATION
|
=head1 INSTALLATION
|
||||||
|
|
||||||
@@ -71,11 +68,11 @@ Download the latest package from that site, and decompress.
|
|||||||
=item
|
=item
|
||||||
|
|
||||||
If you will be using SystemC (vs straight C++ output), download SystemC
|
If you will be using SystemC (vs straight C++ output), download SystemC
|
||||||
2.0.1 from L<http://www.systemc.org>. Follow their installation
|
from L<http://www.systemc.org>. Follow their installation instructions.
|
||||||
instructions. You will need to set SYSTEMC_INCLUDE to point to the
|
You will need to set SYSTEMC_INCLUDE to point to the include directory with
|
||||||
include directory with systemc.h in it, and SYSTEMC_LIBDIR to points
|
systemc.h in it, and SYSTEMC_LIBDIR to points to the directory with
|
||||||
to the directory with libsystemc.a in it. (Older installations may
|
libsystemc.a in it. (Older installations may set SYSTEMC and SYSTEMC_ARCH
|
||||||
set SYSTEMC and SYSTEMC_ARCH instead.)
|
instead.)
|
||||||
|
|
||||||
=item
|
=item
|
||||||
|
|
||||||
@@ -107,7 +104,7 @@ executable, so try to have them correct before configuring.
|
|||||||
|
|
||||||
Our personal favorite is to always run Verilator from the kit directory.
|
Our personal favorite is to always run Verilator from the kit directory.
|
||||||
This allows the easiest experimentation and upgrading. It's also how most
|
This allows the easiest experimentation and upgrading. It's also how most
|
||||||
EDA tools operate; to run any of them you point to the tarball.
|
EDA tools operate; to run you point to the tarball, no install is needed.
|
||||||
|
|
||||||
export VERILATOR_ROOT=`pwd` # if your shell is bash
|
export VERILATOR_ROOT=`pwd` # if your shell is bash
|
||||||
setenv VERILATOR_ROOT `pwd` # if your shell is csh
|
setenv VERILATOR_ROOT `pwd` # if your shell is csh
|
||||||
@@ -156,11 +153,10 @@ PATH.
|
|||||||
|
|
||||||
Type C<make> to compile Verilator.
|
Type C<make> to compile Verilator.
|
||||||
|
|
||||||
Type C<make test_c> to check the compilation.
|
Type C<make test> to check the compilation.
|
||||||
|
|
||||||
Type C<make test> for a more complete test. You may get a error about the
|
Configure with C<--enable-longtests> for more complete developer tests.
|
||||||
Bit::Vector Perl package. You will need to install it and SystemPerl if
|
Additional packages may be required for these tests.
|
||||||
you want all tests to pass.
|
|
||||||
|
|
||||||
You may get a error about a typedef conflict for uint32_t. Edit
|
You may get a error about a typedef conflict for uint32_t. Edit
|
||||||
verilated.h to change the typedef to work, probably to @samp{typedef
|
verilated.h to change the typedef to work, probably to @samp{typedef
|
||||||
@@ -195,7 +191,7 @@ The directories in the kit after de-taring are as follows:
|
|||||||
bin/verilator => Compiler Wrapper invoked to Verilate code
|
bin/verilator => Compiler Wrapper invoked to Verilate code
|
||||||
include/ => Files that should be in your -I compiler path
|
include/ => Files that should be in your -I compiler path
|
||||||
include/verilated*.cpp => Global routines to link into your simulator
|
include/verilated*.cpp => Global routines to link into your simulator
|
||||||
include/verilated.h => Global headers
|
include/verilated*.h => Global headers
|
||||||
include/verilated.v => Stub defines for linting
|
include/verilated.v => Stub defines for linting
|
||||||
include/verilated.mk => Common makefile
|
include/verilated.mk => Common makefile
|
||||||
src/ => Translator source code
|
src/ => Translator source code
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# DESCRIPTION: Verilator: GDB startup file with useful defines
|
# DESCRIPTION: Verilator: GDB startup file with useful defines
|
||||||
#
|
#
|
||||||
# Copyright 2012-2013 by Wilson Snyder. This program is free software; you can
|
# Copyright 2012-2014 by Wilson Snyder. This program is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
#
|
#
|
||||||
# Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
# Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
#
|
#
|
||||||
# Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
# Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
# redistribute it and/or modify it under the terms of either the GNU
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
# Lesser General Public License Version 3 or the Perl Artistic License
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
# Version 2.0.
|
# Version 2.0.
|
||||||
|
|||||||
+2
-2
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -291,7 +291,7 @@ private:
|
|||||||
}
|
}
|
||||||
ActiveDlyVisitor dlyvisitor (nodep, ActiveDlyVisitor::CT_INITIAL);
|
ActiveDlyVisitor dlyvisitor (nodep, ActiveDlyVisitor::CT_INITIAL);
|
||||||
if (!m_scopeFinalp) {
|
if (!m_scopeFinalp) {
|
||||||
m_scopeFinalp = new AstCFunc(nodep->fileline(), "_final", m_namer.scopep());
|
m_scopeFinalp = new AstCFunc(nodep->fileline(), "_final_"+m_namer.scopep()->nameDotless(), m_namer.scopep());
|
||||||
m_scopeFinalp->argTypes(EmitCBaseVisitor::symClassVar());
|
m_scopeFinalp->argTypes(EmitCBaseVisitor::symClassVar());
|
||||||
m_scopeFinalp->addInitsp(new AstCStmt(nodep->fileline(), EmitCBaseVisitor::symTopAssign()+"\n"));
|
m_scopeFinalp->addInitsp(new AstCStmt(nodep->fileline(), EmitCBaseVisitor::symTopAssign()+"\n"));
|
||||||
m_scopeFinalp->dontCombine(true);
|
m_scopeFinalp->dontCombine(true);
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+2
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2005-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2005-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -137,6 +137,7 @@ private:
|
|||||||
if (nodep->castPslAssert()) ifp->branchPred(AstBranchPred::BP_UNLIKELY);
|
if (nodep->castPslAssert()) ifp->branchPred(AstBranchPred::BP_UNLIKELY);
|
||||||
//
|
//
|
||||||
AstNode* newp = new AstAlways (nodep->fileline(),
|
AstNode* newp = new AstAlways (nodep->fileline(),
|
||||||
|
VAlwaysKwd::ALWAYS,
|
||||||
sentreep,
|
sentreep,
|
||||||
bodysp);
|
bodysp);
|
||||||
// Install it
|
// Install it
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2005-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2005-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2005-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2005-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2005-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2005-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+11
-3
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -965,6 +965,14 @@ void AstNode::dumpTreeFileGdb(const char* filenamep) { // For GDB only
|
|||||||
v3Global.rootp()->dumpTreeFile(filename);
|
v3Global.rootp()->dumpTreeFile(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AstNode::checkIter() const {
|
||||||
|
if (m_iterpp) {
|
||||||
|
dumpPtrs(cout);
|
||||||
|
// Perhaps something forgot to clear m_iterpp?
|
||||||
|
this->v3fatalSrc("Iteration link should be NULL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AstNode::dumpPtrs(ostream& os) const {
|
void AstNode::dumpPtrs(ostream& os) const {
|
||||||
os<<"This="<<typeName()<<" "<<(void*)this;
|
os<<"This="<<typeName()<<" "<<(void*)this;
|
||||||
os<<" back="<<(void*)backp();
|
os<<" back="<<(void*)backp();
|
||||||
@@ -1008,8 +1016,8 @@ void AstNode::dumpTreeAndNext(ostream& os, const string& indent, int maxDepth) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AstNode::dumpTreeFile(const string& filename, bool append) {
|
void AstNode::dumpTreeFile(const string& filename, bool append, bool doDump) {
|
||||||
if (v3Global.opt.dumpTree()) {
|
if (v3Global.opt.dumpTree() && doDump) {
|
||||||
{ // Write log & close
|
{ // Write log & close
|
||||||
UINFO(2,"Dumping "<<filename<<endl);
|
UINFO(2,"Dumping "<<filename<<endl);
|
||||||
const auto_ptr<ofstream> logsp (V3File::new_ofstream(filename, append));
|
const auto_ptr<ofstream> logsp (V3File::new_ofstream(filename, append));
|
||||||
|
|||||||
+52
-10
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -38,6 +38,9 @@ class VFlagLogicPacked {};
|
|||||||
class VFlagBitPacked {};
|
class VFlagBitPacked {};
|
||||||
class VFlagChildDType {}; // Used by parser.y to select constructor that sets childDType
|
class VFlagChildDType {}; // Used by parser.y to select constructor that sets childDType
|
||||||
|
|
||||||
|
// For broken() function, return error string if have a match
|
||||||
|
#define BROKEN_RTN(test) do { if (VL_UNLIKELY(test)) return # test; } while(0)
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
|
|
||||||
class AstType {
|
class AstType {
|
||||||
@@ -407,7 +410,8 @@ public:
|
|||||||
BLOCKTEMP,
|
BLOCKTEMP,
|
||||||
MODULETEMP,
|
MODULETEMP,
|
||||||
STMTTEMP,
|
STMTTEMP,
|
||||||
XTEMP
|
XTEMP,
|
||||||
|
IFACEREF // Used to link Interfaces between modules
|
||||||
};
|
};
|
||||||
enum en m_e;
|
enum en m_e;
|
||||||
inline AstVarType () : m_e(UNKNOWN) {}
|
inline AstVarType () : m_e(UNKNOWN) {}
|
||||||
@@ -421,7 +425,8 @@ public:
|
|||||||
"SUPPLY0","SUPPLY1","WIRE","IMPLICITWIRE",
|
"SUPPLY0","SUPPLY1","WIRE","IMPLICITWIRE",
|
||||||
"TRIWIRE","TRI0","TRI1",
|
"TRIWIRE","TRI0","TRI1",
|
||||||
"PORT",
|
"PORT",
|
||||||
"BLOCKTEMP","MODULETEMP","STMTTEMP","XTEMP"};
|
"BLOCKTEMP","MODULETEMP","STMTTEMP","XTEMP",
|
||||||
|
"IFACEREF"};
|
||||||
return names[m_e]; }
|
return names[m_e]; }
|
||||||
bool isSignal() const { return (m_e==WIRE || m_e==IMPLICITWIRE
|
bool isSignal() const { return (m_e==WIRE || m_e==IMPLICITWIRE
|
||||||
|| m_e==TRIWIRE
|
|| m_e==TRIWIRE
|
||||||
@@ -467,6 +472,30 @@ public:
|
|||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
|
|
||||||
|
class VAlwaysKwd {
|
||||||
|
public:
|
||||||
|
enum en {
|
||||||
|
ALWAYS,
|
||||||
|
ALWAYS_FF,
|
||||||
|
ALWAYS_LATCH,
|
||||||
|
ALWAYS_COMB
|
||||||
|
};
|
||||||
|
enum en m_e;
|
||||||
|
inline VAlwaysKwd () : m_e(ALWAYS) {}
|
||||||
|
inline VAlwaysKwd (en _e) : m_e(_e) {}
|
||||||
|
explicit inline VAlwaysKwd (int _e) : m_e(static_cast<en>(_e)) {}
|
||||||
|
operator en () const { return m_e; }
|
||||||
|
const char* ascii() const {
|
||||||
|
static const char* names[] = {
|
||||||
|
"always","always_ff","always_latch","always_comb"};
|
||||||
|
return names[m_e]; }
|
||||||
|
};
|
||||||
|
inline bool operator== (VAlwaysKwd lhs, VAlwaysKwd rhs) { return (lhs.m_e == rhs.m_e); }
|
||||||
|
inline bool operator== (VAlwaysKwd lhs, VAlwaysKwd::en rhs) { return (lhs.m_e == rhs); }
|
||||||
|
inline bool operator== (VAlwaysKwd::en lhs, VAlwaysKwd rhs) { return (lhs == rhs.m_e); }
|
||||||
|
|
||||||
|
//######################################################################
|
||||||
|
|
||||||
class AstCaseType {
|
class AstCaseType {
|
||||||
public:
|
public:
|
||||||
enum en {
|
enum en {
|
||||||
@@ -1124,18 +1153,21 @@ public:
|
|||||||
bool sameTree(AstNode* node2p); // Does tree of this == node2p?
|
bool sameTree(AstNode* node2p); // Does tree of this == node2p?
|
||||||
void deleteTree(); // Always deletes the next link
|
void deleteTree(); // Always deletes the next link
|
||||||
void checkTree(); // User Interface version
|
void checkTree(); // User Interface version
|
||||||
|
void checkIter() const;
|
||||||
|
void clearIter() { m_iterpp=NULL; }
|
||||||
void dumpPtrs(ostream& str=cout) const;
|
void dumpPtrs(ostream& str=cout) const;
|
||||||
void dumpTree(ostream& str=cout, const string& indent=" ", int maxDepth=0);
|
void dumpTree(ostream& str=cout, const string& indent=" ", int maxDepth=0);
|
||||||
void dumpTree(const string& indent, int maxDepth=0) { dumpTree(cout,indent,maxDepth); }
|
void dumpTree(const string& indent, int maxDepth=0) { dumpTree(cout,indent,maxDepth); }
|
||||||
void dumpTreeGdb(); // For GDB only
|
void dumpTreeGdb(); // For GDB only
|
||||||
void dumpTreeAndNext(ostream& str=cout, const string& indent=" ", int maxDepth=0);
|
void dumpTreeAndNext(ostream& str=cout, const string& indent=" ", int maxDepth=0);
|
||||||
void dumpTreeFile(const string& filename, bool append=false);
|
void dumpTreeFile(const string& filename, bool append=false, bool doDump=true);
|
||||||
static void dumpTreeFileGdb(const char* filenamep=NULL);
|
static void dumpTreeFileGdb(const char* filenamep=NULL);
|
||||||
|
|
||||||
// METHODS - queries
|
// METHODS - queries
|
||||||
virtual bool isPure() const { return true; } // Else a $display, etc, that must be ordered with other displays
|
virtual bool isPure() const { return true; } // Else a $display, etc, that must be ordered with other displays
|
||||||
virtual bool isBrancher() const { return false; } // Changes control flow, disable some optimizations
|
virtual bool isBrancher() const { return false; } // Changes control flow, disable some optimizations
|
||||||
virtual bool isGateOptimizable() const { return true; } // Else a AstTime etc that can't be pushed out
|
virtual bool isGateOptimizable() const { return true; } // Else a AstTime etc that can't be pushed out
|
||||||
|
virtual bool isGateDedupable() const { return isGateOptimizable(); } // GateDedupable is a slightly larger superset of GateOptimzable (eg, AstNodeIf)
|
||||||
virtual bool isSubstOptimizable() const { return true; } // Else a AstTime etc that can't be substituted out
|
virtual bool isSubstOptimizable() const { return true; } // Else a AstTime etc that can't be substituted out
|
||||||
virtual bool isPredictOptimizable() const { return true; } // Else a AstTime etc which output can't be predicted from input
|
virtual bool isPredictOptimizable() const { return true; } // Else a AstTime etc which output can't be predicted from input
|
||||||
virtual bool isOutputter() const { return false; } // Else creates output or exits, etc, not unconsumed
|
virtual bool isOutputter() const { return false; } // Else creates output or exits, etc, not unconsumed
|
||||||
@@ -1146,7 +1178,7 @@ public:
|
|||||||
virtual bool hasDType() const { return false; } // Iff has a data type; dtype() must be non null
|
virtual bool hasDType() const { return false; } // Iff has a data type; dtype() must be non null
|
||||||
virtual AstNodeDType* getChildDTypep() const { return NULL; } // Iff has a non-null childDTypep(), as generic node function
|
virtual AstNodeDType* getChildDTypep() const { return NULL; } // Iff has a non-null childDTypep(), as generic node function
|
||||||
virtual bool maybePointedTo() const { return false; } // Another AstNode* may have a pointer into this node, other then normal front/back/etc.
|
virtual bool maybePointedTo() const { return false; } // Another AstNode* may have a pointer into this node, other then normal front/back/etc.
|
||||||
virtual bool broken() const { return false; }
|
virtual const char* broken() const { return NULL; }
|
||||||
|
|
||||||
// INVOKERS
|
// INVOKERS
|
||||||
virtual void accept(AstNVisitor& v, AstNUser* vup=NULL) = 0;
|
virtual void accept(AstNVisitor& v, AstNUser* vup=NULL) = 0;
|
||||||
@@ -1389,6 +1421,7 @@ public:
|
|||||||
void addIfsp(AstNode* newp) { addOp2p(newp); }
|
void addIfsp(AstNode* newp) { addOp2p(newp); }
|
||||||
void addElsesp(AstNode* newp) { addOp3p(newp); }
|
void addElsesp(AstNode* newp) { addOp3p(newp); }
|
||||||
virtual bool isGateOptimizable() const { return false; }
|
virtual bool isGateOptimizable() const { return false; }
|
||||||
|
virtual bool isGateDedupable() const { return true; }
|
||||||
virtual int instrCount() const { return instrCountBranch(); }
|
virtual int instrCount() const { return instrCountBranch(); }
|
||||||
virtual V3Hash sameHash() const { return V3Hash(); }
|
virtual V3Hash sameHash() const { return V3Hash(); }
|
||||||
virtual bool same(AstNode* samep) const { return true; }
|
virtual bool same(AstNode* samep) const { return true; }
|
||||||
@@ -1446,7 +1479,7 @@ public:
|
|||||||
}
|
}
|
||||||
ASTNODE_BASE_FUNCS(NodeVarRef)
|
ASTNODE_BASE_FUNCS(NodeVarRef)
|
||||||
virtual bool hasDType() const { return true; }
|
virtual bool hasDType() const { return true; }
|
||||||
virtual bool broken() const;
|
virtual const char* broken() const;
|
||||||
virtual int instrCount() const { return widthInstrs(); }
|
virtual int instrCount() const { return widthInstrs(); }
|
||||||
virtual void cloneRelink();
|
virtual void cloneRelink();
|
||||||
virtual string name() const { return m_name; } // * = Var name
|
virtual string name() const { return m_name; } // * = Var name
|
||||||
@@ -1509,6 +1542,7 @@ public:
|
|||||||
virtual bool hasDType() const { return true; }
|
virtual bool hasDType() const { return true; }
|
||||||
virtual AstBasicDType* basicp() const = 0; // (Slow) recurse down to find basic data type
|
virtual AstBasicDType* basicp() const = 0; // (Slow) recurse down to find basic data type
|
||||||
virtual AstNodeDType* skipRefp() const = 0; // recurses over typedefs to next non-typeref type
|
virtual AstNodeDType* skipRefp() const = 0; // recurses over typedefs to next non-typeref type
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const = 0; // recurses over typedefs to next non-typeref-or-const type
|
||||||
virtual int widthAlignBytes() const = 0; // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
virtual int widthAlignBytes() const = 0; // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
||||||
virtual int widthTotalBytes() const = 0; // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
virtual int widthTotalBytes() const = 0; // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
||||||
virtual bool maybePointedTo() const { return true; }
|
virtual bool maybePointedTo() const { return true; }
|
||||||
@@ -1553,17 +1587,19 @@ public:
|
|||||||
numeric(numericUnpack.isSigned() ? AstNumeric::SIGNED : AstNumeric::UNSIGNED);
|
numeric(numericUnpack.isSigned() ? AstNumeric::SIGNED : AstNumeric::UNSIGNED);
|
||||||
}
|
}
|
||||||
ASTNODE_BASE_FUNCS(NodeClassDType)
|
ASTNODE_BASE_FUNCS(NodeClassDType)
|
||||||
virtual bool broken() const;
|
virtual const char* broken() const;
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
// For basicp() we reuse the size to indicate a "fake" basic type of same size
|
// For basicp() we reuse the size to indicate a "fake" basic type of same size
|
||||||
virtual AstBasicDType* basicp() const { return findLogicDType(width(),width(),numeric())->castBasicDType(); }
|
virtual AstBasicDType* basicp() const { return findLogicDType(width(),width(),numeric())->castBasicDType(); }
|
||||||
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return (AstNodeDType*)this; }
|
||||||
virtual int widthAlignBytes() const; // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
virtual int widthAlignBytes() const; // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
||||||
virtual int widthTotalBytes() const; // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
virtual int widthTotalBytes() const; // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
||||||
// op1 = members
|
// op1 = members
|
||||||
AstMemberDType* membersp() const { return op1p()->castMemberDType(); } // op1 = AstMember list
|
AstMemberDType* membersp() const { return op1p()->castMemberDType(); } // op1 = AstMember list
|
||||||
void addMembersp(AstNode* nodep) { addNOp1p(nodep); }
|
void addMembersp(AstNode* nodep) { addNOp1p(nodep); }
|
||||||
bool packed() const { return m_packed; }
|
bool packed() const { return m_packed; }
|
||||||
|
bool packedUnsup() const { return true; } // packed() but as don't support unpacked, presently all structs
|
||||||
void clearCache() { m_members.clear(); }
|
void clearCache() { m_members.clear(); }
|
||||||
void repairMemberCache();
|
void repairMemberCache();
|
||||||
AstMemberDType* findMember(const string& name) const {
|
AstMemberDType* findMember(const string& name) const {
|
||||||
@@ -1589,8 +1625,8 @@ public:
|
|||||||
ASTNODE_BASE_FUNCS(NodeArrayDType)
|
ASTNODE_BASE_FUNCS(NodeArrayDType)
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual void dumpSmall(ostream& str);
|
virtual void dumpSmall(ostream& str);
|
||||||
virtual bool broken() const { return !((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists())
|
virtual const char* broken() const { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists())
|
||||||
|| (!m_refDTypep && childDTypep())); }
|
|| (!m_refDTypep && childDTypep()))); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
||||||
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
||||||
}}
|
}}
|
||||||
@@ -1612,6 +1648,7 @@ public:
|
|||||||
// METHODS
|
// METHODS
|
||||||
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
||||||
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return (AstNodeDType*)this; }
|
||||||
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); }
|
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); }
|
||||||
virtual int widthTotalBytes() const { return elementsConst() * subDTypep()->widthTotalBytes(); }
|
virtual int widthTotalBytes() const { return elementsConst() * subDTypep()->widthTotalBytes(); }
|
||||||
int msb() const;
|
int msb() const;
|
||||||
@@ -1714,7 +1751,7 @@ public:
|
|||||||
addNOp2p(pinsp);
|
addNOp2p(pinsp);
|
||||||
}
|
}
|
||||||
ASTNODE_BASE_FUNCS(NodeFTaskRef)
|
ASTNODE_BASE_FUNCS(NodeFTaskRef)
|
||||||
virtual bool broken() const { return m_taskp && !m_taskp->brokeExists(); }
|
virtual const char* broken() const { BROKEN_RTN(m_taskp && !m_taskp->brokeExists()); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_taskp && m_taskp->clonep()) {
|
virtual void cloneRelink() { if (m_taskp && m_taskp->clonep()) {
|
||||||
m_taskp = m_taskp->clonep()->castNodeFTask();
|
m_taskp = m_taskp->clonep()->castNodeFTask();
|
||||||
}}
|
}}
|
||||||
@@ -1821,4 +1858,9 @@ inline int AstNodeArrayDType::lsb() const { return rangep()->lsbConst(); }
|
|||||||
inline int AstNodeArrayDType::elementsConst() const { return rangep()->elementsConst(); }
|
inline int AstNodeArrayDType::elementsConst() const { return rangep()->elementsConst(); }
|
||||||
inline VNumRange AstNodeArrayDType::declRange() const { return VNumRange(msb(), lsb(), rangep()->littleEndian()); }
|
inline VNumRange AstNodeArrayDType::declRange() const { return VNumRange(msb(), lsb(), rangep()->littleEndian()); }
|
||||||
|
|
||||||
|
inline void AstIfaceRefDType::cloneRelink() {
|
||||||
|
if (m_cellp && m_cellp->clonep()) m_cellp = m_cellp->clonep()->castCell();
|
||||||
|
if (m_ifacep && m_ifacep->clonep()) m_ifacep = m_ifacep->clonep()->castIface();
|
||||||
|
if (m_modportp && m_modportp->clonep()) m_modportp = m_modportp->clonep()->castModport(); }
|
||||||
|
|
||||||
#endif // Guard
|
#endif // Guard
|
||||||
|
|||||||
+77
-18
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -35,8 +35,22 @@
|
|||||||
// Special methods
|
// Special methods
|
||||||
|
|
||||||
// We need these here, because the classes they point to aren't defined when we declare the class
|
// We need these here, because the classes they point to aren't defined when we declare the class
|
||||||
bool AstNodeVarRef::broken() const { return ((m_varScopep && !m_varScopep->brokeExists())
|
const char* AstIfaceRefDType::broken() const {
|
||||||
|| (m_varp && !m_varp->brokeExists())); }
|
BROKEN_RTN(m_ifacep && !m_ifacep->brokeExists());
|
||||||
|
BROKEN_RTN(m_cellp && !m_cellp->brokeExists());
|
||||||
|
BROKEN_RTN(m_modportp && !m_modportp->brokeExists());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
AstIface* AstIfaceRefDType::ifaceViaCellp() const {
|
||||||
|
return ((m_cellp && m_cellp->modp()) ? m_cellp->modp()->castIface() : m_ifacep);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* AstNodeVarRef::broken() const {
|
||||||
|
BROKEN_RTN(m_varScopep && !m_varScopep->brokeExists());
|
||||||
|
BROKEN_RTN(m_varp && !m_varp->brokeExists());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void AstNodeVarRef::cloneRelink() {
|
void AstNodeVarRef::cloneRelink() {
|
||||||
if (m_varp && m_varp->clonep()) { m_varp = m_varp->clonep()->castVar(); }
|
if (m_varp && m_varp->clonep()) { m_varp = m_varp->clonep()->castVar(); }
|
||||||
@@ -54,18 +68,18 @@ void AstNodeClassDType::repairMemberCache() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AstNodeClassDType::broken() const {
|
const char* AstNodeClassDType::broken() const {
|
||||||
set<AstMemberDType*> exists;
|
set<AstMemberDType*> exists;
|
||||||
for (AstMemberDType* itemp = membersp(); itemp; itemp=itemp->nextp()->castMemberDType()) {
|
for (AstMemberDType* itemp = membersp(); itemp; itemp=itemp->nextp()->castMemberDType()) {
|
||||||
exists.insert(itemp);
|
exists.insert(itemp);
|
||||||
}
|
}
|
||||||
for (MemberNameMap::const_iterator it=m_members.begin(); it!=m_members.end(); ++it) {
|
for (MemberNameMap::const_iterator it=m_members.begin(); it!=m_members.end(); ++it) {
|
||||||
if (exists.find(it->second) == exists.end()) {
|
if (VL_UNLIKELY(exists.find(it->second) == exists.end())) {
|
||||||
this->v3error("Internal: Structure member broken: "<<it->first);
|
this->v3error("Internal: Structure member broken: "<<it->first);
|
||||||
return true;
|
return "member broken";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AstBasicDType::widthAlignBytes() const {
|
int AstBasicDType::widthAlignBytes() const {
|
||||||
@@ -103,13 +117,21 @@ bool AstVar::isSigPublic() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AstVar::isScQuad() const {
|
bool AstVar::isScQuad() const {
|
||||||
return (isSc() && isQuad() && !isScBv());
|
return (isSc() && isQuad() && !isScBv() && !isScBigUint());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AstVar::isScBv() const {
|
bool AstVar::isScBv() const {
|
||||||
return ((isSc() && width() >= v3Global.opt.pinsBv()) || m_attrScBv);
|
return ((isSc() && width() >= v3Global.opt.pinsBv()) || m_attrScBv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AstVar::isScUint() const {
|
||||||
|
return ((isSc() && v3Global.opt.pinsScUint() && width() >= 2 && width() <= 64) && !isScBv());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AstVar::isScBigUint() const {
|
||||||
|
return ((isSc() && v3Global.opt.pinsScBigUint() && width() >= 65 && width() <= 512) && !isScBv());
|
||||||
|
}
|
||||||
|
|
||||||
void AstVar::combineType(AstVarType type) {
|
void AstVar::combineType(AstVarType type) {
|
||||||
// These flags get combined with the existing settings of the flags.
|
// These flags get combined with the existing settings of the flags.
|
||||||
// We don't test varType for certain types, instead set flags since
|
// We don't test varType for certain types, instead set flags since
|
||||||
@@ -278,7 +300,11 @@ string AstVar::dpiArgType(bool named, bool forReturn) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
string AstVar::scType() const {
|
string AstVar::scType() const {
|
||||||
if (isScBv()) {
|
if (isScBigUint()) {
|
||||||
|
return (string("sc_biguint<")+cvtToStr(widthMin())+"> "); // Keep the space so don't get >>
|
||||||
|
} else if (isScUint()) {
|
||||||
|
return (string("sc_uint<")+cvtToStr(widthMin())+"> "); // Keep the space so don't get >>
|
||||||
|
} else if (isScBv()) {
|
||||||
return (string("sc_bv<")+cvtToStr(widthMin())+"> "); // Keep the space so don't get >>
|
return (string("sc_bv<")+cvtToStr(widthMin())+"> "); // Keep the space so don't get >>
|
||||||
} else if (widthMin() == 1) {
|
} else if (widthMin() == 1) {
|
||||||
return "bool";
|
return "bool";
|
||||||
@@ -407,10 +433,12 @@ AstNode* AstArraySel::baseFromp(AstNode* nodep) { ///< What is the base variable
|
|||||||
return nodep;
|
return nodep;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AstScope::broken() const {
|
const char* AstScope::broken() const {
|
||||||
return ((m_aboveScopep && !m_aboveScopep->brokeExists())
|
BROKEN_RTN(m_aboveScopep && !m_aboveScopep->brokeExists());
|
||||||
|| (m_aboveCellp && !m_aboveCellp->brokeExists())
|
BROKEN_RTN(m_aboveCellp && !m_aboveCellp->brokeExists());
|
||||||
|| !m_modp || !m_modp->brokeExists());
|
BROKEN_RTN(!m_modp);
|
||||||
|
BROKEN_RTN(m_modp && !m_modp->brokeExists());
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AstScope::cloneRelink() {
|
void AstScope::cloneRelink() {
|
||||||
@@ -665,6 +693,11 @@ void AstNode::dump(ostream& str) {
|
|||||||
if (name()!="") str<<" "<<AstNode::quoteName(name());
|
if (name()!="") str<<" "<<AstNode::quoteName(name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AstAlways::dump(ostream& str) {
|
||||||
|
this->AstNode::dump(str);
|
||||||
|
if (keyword() != VAlwaysKwd::ALWAYS) str<<" ["<<keyword().ascii()<<"]";
|
||||||
|
}
|
||||||
|
|
||||||
void AstArraySel::dump(ostream& str) {
|
void AstArraySel::dump(ostream& str) {
|
||||||
this->AstNode::dump(str);
|
this->AstNode::dump(str);
|
||||||
str<<" [start:"<<start()<<"] [length:"<<length()<<"]";
|
str<<" [start:"<<start()<<"] [length:"<<length()<<"]";
|
||||||
@@ -695,17 +728,43 @@ void AstDisplay::dump(ostream& str) {
|
|||||||
this->AstNode::dump(str);
|
this->AstNode::dump(str);
|
||||||
//str<<" "<<displayType().ascii();
|
//str<<" "<<displayType().ascii();
|
||||||
}
|
}
|
||||||
|
void AstEnumItemRef::dump(ostream& str) {
|
||||||
|
this->AstNode::dump(str);
|
||||||
|
str<<" -> ";
|
||||||
|
if (itemp()) { itemp()->dump(str); }
|
||||||
|
else { str<<"UNLINKED"; }
|
||||||
|
}
|
||||||
|
void AstIfaceRefDType::dump(ostream& str) {
|
||||||
|
this->AstNode::dump(str);
|
||||||
|
if (cellName()!="") { str<<" cell="<<cellName(); }
|
||||||
|
if (ifaceName()!="") { str<<" if="<<ifaceName(); }
|
||||||
|
if (modportName()!="") { str<<" mp="<<modportName(); }
|
||||||
|
if (cellp()) { str<<" -> "; cellp()->dump(str); }
|
||||||
|
else if (ifacep()) { str<<" -> "; ifacep()->dump(str); }
|
||||||
|
else { str<<" -> UNLINKED"; }
|
||||||
|
}
|
||||||
|
void AstIfaceRefDType::dumpSmall(ostream& str) {
|
||||||
|
this->AstNodeDType::dumpSmall(str);
|
||||||
|
str<<"iface";
|
||||||
|
}
|
||||||
void AstJumpGo::dump(ostream& str) {
|
void AstJumpGo::dump(ostream& str) {
|
||||||
this->AstNode::dump(str);
|
this->AstNode::dump(str);
|
||||||
str<<" -> ";
|
str<<" -> ";
|
||||||
if (labelp()) { labelp()->dump(str); }
|
if (labelp()) { labelp()->dump(str); }
|
||||||
else { str<<"%Error:UNLINKED"; }
|
else { str<<"%Error:UNLINKED"; }
|
||||||
}
|
}
|
||||||
void AstEnumItemRef::dump(ostream& str) {
|
void AstModportFTaskRef::dump(ostream& str) {
|
||||||
this->AstNode::dump(str);
|
this->AstNode::dump(str);
|
||||||
str<<" -> ";
|
if (isExport()) str<<" EXPORT";
|
||||||
if (itemp()) { itemp()->dump(str); }
|
if (isImport()) str<<" IMPORT";
|
||||||
else { str<<"UNLINKED"; }
|
if (ftaskp()) { str<<" -> "; ftaskp()->dump(str); }
|
||||||
|
else { str<<" -> UNLINKED"; }
|
||||||
|
}
|
||||||
|
void AstModportVarRef::dump(ostream& str) {
|
||||||
|
this->AstNode::dump(str);
|
||||||
|
str<<" "<<varType();
|
||||||
|
if (varp()) { str<<" -> "; varp()->dump(str); }
|
||||||
|
else { str<<" -> UNLINKED"; }
|
||||||
}
|
}
|
||||||
void AstPin::dump(ostream& str) {
|
void AstPin::dump(ostream& str) {
|
||||||
this->AstNode::dump(str);
|
this->AstNode::dump(str);
|
||||||
@@ -822,7 +881,7 @@ void AstVarXRef::dump(ostream& str) {
|
|||||||
if (lvalue()) str<<" [LV] => ";
|
if (lvalue()) str<<" [LV] => ";
|
||||||
else str<<" [RV] <- ";
|
else str<<" [RV] <- ";
|
||||||
str<<dotted()<<". - ";
|
str<<dotted()<<". - ";
|
||||||
if (inlinedDots()!="") str<<" flat.="<<inlinedDots()<<" - ";
|
if (inlinedDots()!="") str<<" inline.="<<inlinedDots()<<" - ";
|
||||||
if (varScopep()) { varScopep()->dump(str); }
|
if (varScopep()) { varScopep()->dump(str); }
|
||||||
else if (varp()) { varp()->dump(str); }
|
else if (varp()) { varp()->dump(str); }
|
||||||
else { str<<"UNLINKED"; }
|
else { str<<"UNLINKED"; }
|
||||||
|
|||||||
+250
-75
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -227,6 +227,7 @@ public:
|
|||||||
AstNodeDType* dtypeSkipRefp() const { return dtypep()->skipRefp(); } // op1 = Range of variable
|
AstNodeDType* dtypeSkipRefp() const { return dtypep()->skipRefp(); } // op1 = Range of variable
|
||||||
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
||||||
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return (AstNodeDType*)this; }
|
||||||
virtual int widthAlignBytes() const { return dtypep()->widthAlignBytes(); }
|
virtual int widthAlignBytes() const { return dtypep()->widthAlignBytes(); }
|
||||||
virtual int widthTotalBytes() const { return dtypep()->widthTotalBytes(); }
|
virtual int widthTotalBytes() const { return dtypep()->widthTotalBytes(); }
|
||||||
virtual string name() const { return m_name; }
|
virtual string name() const { return m_name; }
|
||||||
@@ -244,16 +245,16 @@ public:
|
|||||||
refDTypep(NULL);
|
refDTypep(NULL);
|
||||||
setOp2p(rangep);
|
setOp2p(rangep);
|
||||||
dtypep(NULL); // V3Width will resolve
|
dtypep(NULL); // V3Width will resolve
|
||||||
// For backward compatibility AstNodeArrayDType and others inherit width and signing from the subDType/base type
|
int width = subDTypep()->width() * rangep->elementsConst();
|
||||||
widthFromSub(subDTypep());
|
widthForce(width,width);
|
||||||
}
|
}
|
||||||
AstPackArrayDType(FileLine* fl, AstNodeDType* dtp, AstRange* rangep)
|
AstPackArrayDType(FileLine* fl, AstNodeDType* dtp, AstRange* rangep)
|
||||||
: AstNodeArrayDType(fl) {
|
: AstNodeArrayDType(fl) {
|
||||||
refDTypep(dtp);
|
refDTypep(dtp);
|
||||||
setOp2p(rangep);
|
setOp2p(rangep);
|
||||||
dtypep(this);
|
dtypep(this);
|
||||||
// For backward compatibility AstNodeArrayDType and others inherit width and signing from the subDType/base type
|
int width = subDTypep()->width() * rangep->elementsConst();
|
||||||
widthFromSub(subDTypep());
|
widthForce(width,width);
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(PackArrayDType, PACKARRAYDTYPE)
|
ASTNODE_NODE_FUNCS(PackArrayDType, PACKARRAYDTYPE)
|
||||||
};
|
};
|
||||||
@@ -357,7 +358,7 @@ public:
|
|||||||
virtual bool same(AstNode* samep) const { // width/widthMin/numeric compared elsewhere
|
virtual bool same(AstNode* samep) const { // width/widthMin/numeric compared elsewhere
|
||||||
return samep->castBasicDType()->m == m; }
|
return samep->castBasicDType()->m == m; }
|
||||||
virtual string name() const { return m.m_keyword.ascii(); }
|
virtual string name() const { return m.m_keyword.ascii(); }
|
||||||
virtual bool broken() const { return dtypep()!=this; }
|
virtual const char* broken() const { BROKEN_RTN(dtypep()!=this); return NULL; }
|
||||||
AstRange* rangep() const { return op1p()->castRange(); } // op1 = Range of variable
|
AstRange* rangep() const { return op1p()->castRange(); } // op1 = Range of variable
|
||||||
void rangep(AstRange* nodep) { setNOp1p(nodep); }
|
void rangep(AstRange* nodep) { setNOp1p(nodep); }
|
||||||
void setSignedState(VSignedState signst) {
|
void setSignedState(VSignedState signst) {
|
||||||
@@ -368,6 +369,7 @@ public:
|
|||||||
// METHODS
|
// METHODS
|
||||||
virtual AstBasicDType* basicp() const { return (AstBasicDType*)this; } // (Slow) recurse down to find basic data type
|
virtual AstBasicDType* basicp() const { return (AstBasicDType*)this; } // (Slow) recurse down to find basic data type
|
||||||
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return (AstNodeDType*)this; }
|
||||||
virtual int widthAlignBytes() const; // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
virtual int widthAlignBytes() const; // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
||||||
virtual int widthTotalBytes() const; // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
virtual int widthTotalBytes() const; // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
||||||
AstBasicDTypeKwd keyword() const { return m.m_keyword; } // Avoid using - use isSomething accessors instead
|
AstBasicDTypeKwd keyword() const { return m.m_keyword; } // Avoid using - use isSomething accessors instead
|
||||||
@@ -410,8 +412,8 @@ public:
|
|||||||
widthFromSub(subDTypep());
|
widthFromSub(subDTypep());
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(ConstDType, CONSTDTYPE)
|
ASTNODE_NODE_FUNCS(ConstDType, CONSTDTYPE)
|
||||||
virtual bool broken() const { return !((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists())
|
virtual const char* broken() const { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists())
|
||||||
|| (!m_refDTypep && childDTypep())); }
|
|| (!m_refDTypep && childDTypep()))); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
||||||
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
||||||
}}
|
}}
|
||||||
@@ -427,11 +429,55 @@ public:
|
|||||||
virtual void virtRefDTypep(AstNodeDType* nodep) { refDTypep(nodep); }
|
virtual void virtRefDTypep(AstNodeDType* nodep) { refDTypep(nodep); }
|
||||||
// METHODS
|
// METHODS
|
||||||
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
||||||
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
virtual AstNodeDType* skipRefp() const { return subDTypep()->skipRefp(); }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return (AstNodeDType*)this; }
|
||||||
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); }
|
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); }
|
||||||
virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); }
|
virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AstIfaceRefDType : public AstNodeDType {
|
||||||
|
// Reference to an interface, either for a port, or inside parent cell
|
||||||
|
private:
|
||||||
|
string m_cellName; // "" = no cell, such as when connects to 'input' iface
|
||||||
|
string m_ifaceName; // Interface name
|
||||||
|
string m_modportName; // "" = no modport
|
||||||
|
AstIface* m_ifacep; // Pointer to interface; note cellp() should override
|
||||||
|
AstCell* m_cellp; // When exact parent cell known; not a guess
|
||||||
|
AstModport* m_modportp; // NULL = unlinked or no modport
|
||||||
|
public:
|
||||||
|
AstIfaceRefDType(FileLine* fl, const string& cellName, const string& ifaceName)
|
||||||
|
: AstNodeDType(fl), m_cellName(cellName), m_ifaceName(ifaceName), m_modportName(""),
|
||||||
|
m_ifacep(NULL), m_cellp(NULL), m_modportp(NULL) { }
|
||||||
|
AstIfaceRefDType(FileLine* fl, const string& cellName, const string& ifaceName, const string& modport)
|
||||||
|
: AstNodeDType(fl), m_cellName(cellName), m_ifaceName(ifaceName), m_modportName(modport),
|
||||||
|
m_ifacep(NULL), m_cellp(NULL), m_modportp(NULL) { }
|
||||||
|
ASTNODE_NODE_FUNCS(IfaceRefDType, IFACEREFDTYPE)
|
||||||
|
// METHODS
|
||||||
|
virtual const char* broken() const;
|
||||||
|
virtual void dump(ostream& str=cout);
|
||||||
|
virtual void dumpSmall(ostream& str);
|
||||||
|
virtual void cloneRelink();
|
||||||
|
virtual AstBasicDType* basicp() const { return NULL; }
|
||||||
|
virtual AstNodeDType* skipRefp() const { return (AstNodeDType*)this; }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return (AstNodeDType*)this; }
|
||||||
|
virtual int widthAlignBytes() const { return 1; }
|
||||||
|
virtual int widthTotalBytes() const { return 1; }
|
||||||
|
string cellName() const { return m_cellName; }
|
||||||
|
void cellName(const string& name) { m_cellName=name; }
|
||||||
|
string ifaceName() const { return m_ifaceName; }
|
||||||
|
void ifaceName(const string& name) { m_ifaceName=name; }
|
||||||
|
string modportName() const { return m_modportName; }
|
||||||
|
void modportName(const string& name) { m_modportName=name; }
|
||||||
|
AstIface* ifaceViaCellp() const; // Use cellp or ifacep
|
||||||
|
AstIface* ifacep() const { return m_ifacep; }
|
||||||
|
void ifacep(AstIface* nodep) { m_ifacep=nodep; }
|
||||||
|
AstCell* cellp() const { return m_cellp; }
|
||||||
|
void cellp(AstCell* nodep) { m_cellp=nodep; }
|
||||||
|
AstModport* modportp() const { return m_modportp; }
|
||||||
|
void modportp(AstModport* modportp) { m_modportp=modportp; }
|
||||||
|
bool isModport() { return !m_modportName.empty(); }
|
||||||
|
};
|
||||||
|
|
||||||
struct AstRefDType : public AstNodeDType {
|
struct AstRefDType : public AstNodeDType {
|
||||||
private:
|
private:
|
||||||
AstNodeDType* m_refDTypep; // data type pointed to, BELOW the AstTypedef
|
AstNodeDType* m_refDTypep; // data type pointed to, BELOW the AstTypedef
|
||||||
@@ -447,7 +493,7 @@ public:
|
|||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(RefDType, REFDTYPE)
|
ASTNODE_NODE_FUNCS(RefDType, REFDTYPE)
|
||||||
// METHODS
|
// METHODS
|
||||||
virtual bool broken() const { return m_refDTypep && !m_refDTypep->brokeExists(); }
|
virtual const char* broken() const { BROKEN_RTN(m_refDTypep && !m_refDTypep->brokeExists()); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
||||||
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
||||||
}}
|
}}
|
||||||
@@ -464,6 +510,10 @@ public:
|
|||||||
if (defp()) return defp()->skipRefp();
|
if (defp()) return defp()->skipRefp();
|
||||||
else { v3fatalSrc("Typedef not linked"); return NULL; }
|
else { v3fatalSrc("Typedef not linked"); return NULL; }
|
||||||
}
|
}
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const {
|
||||||
|
if (defp()) return defp()->skipRefToConstp();
|
||||||
|
else { v3fatalSrc("Typedef not linked"); return NULL; }
|
||||||
|
}
|
||||||
virtual int widthAlignBytes() const { return dtypeSkipRefp()->widthAlignBytes(); }
|
virtual int widthAlignBytes() const { return dtypeSkipRefp()->widthAlignBytes(); }
|
||||||
virtual int widthTotalBytes() const { return dtypeSkipRefp()->widthTotalBytes(); }
|
virtual int widthTotalBytes() const { return dtypeSkipRefp()->widthTotalBytes(); }
|
||||||
void name(const string& flag) { m_name = flag; }
|
void name(const string& flag) { m_name = flag; }
|
||||||
@@ -531,7 +581,8 @@ public:
|
|||||||
//
|
//
|
||||||
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type (Note don't need virtual - AstVar isn't a NodeDType)
|
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type (Note don't need virtual - AstVar isn't a NodeDType)
|
||||||
AstNodeDType* dtypeSkipRefp() const { return subDTypep()->skipRefp(); } // op1 = Range of variable (Note don't need virtual - AstVar isn't a NodeDType)
|
AstNodeDType* dtypeSkipRefp() const { return subDTypep()->skipRefp(); } // op1 = Range of variable (Note don't need virtual - AstVar isn't a NodeDType)
|
||||||
virtual AstNodeDType* skipRefp() const { return dtypeSkipRefp(); }
|
virtual AstNodeDType* skipRefp() const { return subDTypep()->skipRefp(); }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return subDTypep()->skipRefToConstp(); }
|
||||||
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); } // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); } // (Slow) recurses - Structure alignment 1,2,4 or 8 bytes (arrays affect this)
|
||||||
virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); } // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); } // (Slow) recurses - Width in bytes rounding up 1,2,4,8,12,...
|
||||||
// METHODS
|
// METHODS
|
||||||
@@ -571,7 +622,7 @@ public:
|
|||||||
ASTNODE_NODE_FUNCS(EnumItemRef, ENUMITEMREF)
|
ASTNODE_NODE_FUNCS(EnumItemRef, ENUMITEMREF)
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual string name() const { return itemp()->name(); }
|
virtual string name() const { return itemp()->name(); }
|
||||||
virtual bool broken() const { return !itemp(); }
|
virtual const char* broken() const { BROKEN_RTN(!itemp()); return NULL; }
|
||||||
virtual int instrCount() const { return 0; }
|
virtual int instrCount() const { return 0; }
|
||||||
virtual void cloneRelink() { if (m_itemp->clonep()) m_itemp = m_itemp->clonep()->castEnumItem(); }
|
virtual void cloneRelink() { if (m_itemp->clonep()) m_itemp = m_itemp->clonep()->castEnumItem(); }
|
||||||
virtual bool same(AstNode* samep) const {
|
virtual bool same(AstNode* samep) const {
|
||||||
@@ -601,8 +652,8 @@ public:
|
|||||||
m_uniqueNum = uniqueNumInc();
|
m_uniqueNum = uniqueNumInc();
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(EnumDType, ENUMDTYPE)
|
ASTNODE_NODE_FUNCS(EnumDType, ENUMDTYPE)
|
||||||
virtual bool broken() const { return !((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists())
|
virtual const char* broken() const { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists())
|
||||||
|| (!m_refDTypep && childDTypep())); }
|
|| (!m_refDTypep && childDTypep()))); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) {
|
||||||
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
m_refDTypep = m_refDTypep->clonep()->castNodeDType();
|
||||||
}}
|
}}
|
||||||
@@ -620,6 +671,7 @@ public:
|
|||||||
// METHODS
|
// METHODS
|
||||||
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
|
||||||
virtual AstNodeDType* skipRefp() const { return subDTypep()->skipRefp(); }
|
virtual AstNodeDType* skipRefp() const { return subDTypep()->skipRefp(); }
|
||||||
|
virtual AstNodeDType* skipRefToConstp() const { return subDTypep()->skipRefToConstp(); }
|
||||||
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); }
|
virtual int widthAlignBytes() const { return subDTypep()->widthAlignBytes(); }
|
||||||
virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); }
|
virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); }
|
||||||
};
|
};
|
||||||
@@ -633,9 +685,9 @@ private:
|
|||||||
unsigned m_start;
|
unsigned m_start;
|
||||||
unsigned m_length;
|
unsigned m_length;
|
||||||
void init(AstNode* fromp) {
|
void init(AstNode* fromp) {
|
||||||
if (fromp && fromp->dtypep()->castNodeArrayDType()) {
|
if (fromp && fromp->dtypep()->skipRefp()->castNodeArrayDType()) {
|
||||||
// Strip off array to find what array references
|
// Strip off array to find what array references
|
||||||
dtypeFrom(fromp->dtypep()->castNodeArrayDType()->subDTypep());
|
dtypeFrom(fromp->dtypep()->skipRefp()->castNodeArrayDType()->subDTypep());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
@@ -815,6 +867,7 @@ struct AstVar : public AstNode {
|
|||||||
// A variable (in/out/wire/reg/param) inside a module
|
// A variable (in/out/wire/reg/param) inside a module
|
||||||
private:
|
private:
|
||||||
string m_name; // Name of variable
|
string m_name; // Name of variable
|
||||||
|
string m_origName; // Original name before dot addition
|
||||||
AstVarType m_varType; // Type of variable
|
AstVarType m_varType; // Type of variable
|
||||||
bool m_input:1; // Input or inout
|
bool m_input:1; // Input or inout
|
||||||
bool m_output:1; // Output or inout
|
bool m_output:1; // Output or inout
|
||||||
@@ -842,6 +895,7 @@ private:
|
|||||||
bool m_isStatic:1; // Static variable
|
bool m_isStatic:1; // Static variable
|
||||||
bool m_isPulldown:1; // Tri0
|
bool m_isPulldown:1; // Tri0
|
||||||
bool m_isPullup:1; // Tri1
|
bool m_isPullup:1; // Tri1
|
||||||
|
bool m_isIfaceParent:1; // dtype is reference to interface present in this module
|
||||||
bool m_trace:1; // Trace this variable
|
bool m_trace:1; // Trace this variable
|
||||||
|
|
||||||
void init() {
|
void init() {
|
||||||
@@ -853,12 +907,13 @@ private:
|
|||||||
m_funcLocal=false; m_funcReturn=false;
|
m_funcLocal=false; m_funcReturn=false;
|
||||||
m_attrClockEn=false; m_attrScBv=false; m_attrIsolateAssign=false; m_attrSFormat=false;
|
m_attrClockEn=false; m_attrScBv=false; m_attrIsolateAssign=false; m_attrSFormat=false;
|
||||||
m_fileDescr=false; m_isConst=false; m_isStatic=false; m_isPulldown=false; m_isPullup=false;
|
m_fileDescr=false; m_isConst=false; m_isStatic=false; m_isPulldown=false; m_isPullup=false;
|
||||||
|
m_isIfaceParent=false;
|
||||||
m_trace=false;
|
m_trace=false;
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
AstVar(FileLine* fl, AstVarType type, const string& name, VFlagChildDType, AstNodeDType* dtp)
|
AstVar(FileLine* fl, AstVarType type, const string& name, VFlagChildDType, AstNodeDType* dtp)
|
||||||
:AstNode(fl)
|
:AstNode(fl)
|
||||||
, m_name(name) {
|
, m_name(name), m_origName(name) {
|
||||||
init();
|
init();
|
||||||
combineType(type);
|
combineType(type);
|
||||||
childDTypep(dtp); // Only for parser
|
childDTypep(dtp); // Only for parser
|
||||||
@@ -866,7 +921,7 @@ public:
|
|||||||
}
|
}
|
||||||
AstVar(FileLine* fl, AstVarType type, const string& name, AstNodeDType* dtp)
|
AstVar(FileLine* fl, AstVarType type, const string& name, AstNodeDType* dtp)
|
||||||
:AstNode(fl)
|
:AstNode(fl)
|
||||||
, m_name(name) {
|
, m_name(name), m_origName(name) {
|
||||||
init();
|
init();
|
||||||
combineType(type);
|
combineType(type);
|
||||||
UASSERT(dtp,"AstVar created with no dtype");
|
UASSERT(dtp,"AstVar created with no dtype");
|
||||||
@@ -874,21 +929,21 @@ public:
|
|||||||
}
|
}
|
||||||
AstVar(FileLine* fl, AstVarType type, const string& name, VFlagLogicPacked, int wantwidth)
|
AstVar(FileLine* fl, AstVarType type, const string& name, VFlagLogicPacked, int wantwidth)
|
||||||
:AstNode(fl)
|
:AstNode(fl)
|
||||||
, m_name(name) {
|
, m_name(name), m_origName(name) {
|
||||||
init();
|
init();
|
||||||
combineType(type);
|
combineType(type);
|
||||||
dtypeSetLogicSized(wantwidth,wantwidth,AstNumeric::UNSIGNED);
|
dtypeSetLogicSized(wantwidth,wantwidth,AstNumeric::UNSIGNED);
|
||||||
}
|
}
|
||||||
AstVar(FileLine* fl, AstVarType type, const string& name, VFlagBitPacked, int wantwidth)
|
AstVar(FileLine* fl, AstVarType type, const string& name, VFlagBitPacked, int wantwidth)
|
||||||
:AstNode(fl)
|
:AstNode(fl)
|
||||||
, m_name(name) {
|
, m_name(name), m_origName(name) {
|
||||||
init();
|
init();
|
||||||
combineType(type);
|
combineType(type);
|
||||||
dtypeSetLogicSized(wantwidth,wantwidth,AstNumeric::UNSIGNED);
|
dtypeSetLogicSized(wantwidth,wantwidth,AstNumeric::UNSIGNED);
|
||||||
}
|
}
|
||||||
AstVar(FileLine* fl, AstVarType type, const string& name, AstVar* examplep)
|
AstVar(FileLine* fl, AstVarType type, const string& name, AstVar* examplep)
|
||||||
:AstNode(fl)
|
:AstNode(fl)
|
||||||
, m_name(name) {
|
, m_name(name), m_origName(name) {
|
||||||
init();
|
init();
|
||||||
combineType(type);
|
combineType(type);
|
||||||
if (examplep->childDTypep()) {
|
if (examplep->childDTypep()) {
|
||||||
@@ -898,10 +953,13 @@ public:
|
|||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(Var, VAR)
|
ASTNODE_NODE_FUNCS(Var, VAR)
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual string name() const { return m_name; } // * = Var name
|
virtual string name() const { return m_name; } // * = Var name
|
||||||
virtual bool hasDType() const { return true; }
|
virtual bool hasDType() const { return true; }
|
||||||
virtual bool maybePointedTo() const { return true; }
|
virtual bool maybePointedTo() const { return true; }
|
||||||
AstVarType varType() const { return m_varType; } // * = Type of variable
|
string origName() const { return m_origName; } // * = Original name
|
||||||
|
void origName(const string& name) { m_origName = name; }
|
||||||
|
AstVarType varType() const { return m_varType; } // * = Type of variable
|
||||||
|
void varType(AstVarType type) { m_varType = type; }
|
||||||
void varType2Out() { m_tristate=0; m_input=0; m_output=1; }
|
void varType2Out() { m_tristate=0; m_input=0; m_output=1; }
|
||||||
void varType2In() { m_tristate=0; m_input=1; m_output=0; }
|
void varType2In() { m_tristate=0; m_input=1; m_output=0; }
|
||||||
string scType() const; // Return SysC type: bool, uint32_t, uint64_t, sc_bv
|
string scType() const; // Return SysC type: bool, uint32_t, uint64_t, sc_bv
|
||||||
@@ -913,7 +971,7 @@ public:
|
|||||||
void combineType(AstVarType type);
|
void combineType(AstVarType type);
|
||||||
AstNodeDType* getChildDTypep() const { return childDTypep(); }
|
AstNodeDType* getChildDTypep() const { return childDTypep(); }
|
||||||
AstNodeDType* childDTypep() const { return op1p()->castNodeDType(); } // op1 = Range of variable
|
AstNodeDType* childDTypep() const { return op1p()->castNodeDType(); } // op1 = Range of variable
|
||||||
AstNodeDType* dtypeSkipRefp() const { return subDTypep()->skipRefp(); } // op1 = Range of variable (Note don't need virtual - AstVar isn't a NodeDType)
|
AstNodeDType* dtypeSkipRefp() const { return subDTypep()->skipRefp(); }
|
||||||
AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type (Note don't need virtual - AstVar isn't a NodeDType)
|
AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type (Note don't need virtual - AstVar isn't a NodeDType)
|
||||||
AstNode* valuep() const { return op3p()->castNode(); } // op3 = Initial value that never changes (static const)
|
AstNode* valuep() const { return op3p()->castNode(); } // op3 = Initial value that never changes (static const)
|
||||||
void valuep(AstNode* nodep) { setOp3p(nodep); } // It's valuep, not constp, as may be more complicated than an AstConst
|
void valuep(AstNode* nodep) { setOp3p(nodep); } // It's valuep, not constp, as may be more complicated than an AstConst
|
||||||
@@ -940,6 +998,7 @@ public:
|
|||||||
void primaryIO(bool flag) { m_primaryIO = flag; }
|
void primaryIO(bool flag) { m_primaryIO = flag; }
|
||||||
void isConst(bool flag) { m_isConst = flag; }
|
void isConst(bool flag) { m_isConst = flag; }
|
||||||
void isStatic(bool flag) { m_isStatic = flag; }
|
void isStatic(bool flag) { m_isStatic = flag; }
|
||||||
|
void isIfaceParent(bool flag) { m_isIfaceParent = flag; }
|
||||||
void funcLocal(bool flag) { m_funcLocal = flag; }
|
void funcLocal(bool flag) { m_funcLocal = flag; }
|
||||||
void funcReturn(bool flag) { m_funcReturn = flag; }
|
void funcReturn(bool flag) { m_funcReturn = flag; }
|
||||||
void trace(bool flag) { m_trace=flag; }
|
void trace(bool flag) { m_trace=flag; }
|
||||||
@@ -955,6 +1014,8 @@ public:
|
|||||||
bool isPrimaryIO() const { return m_primaryIO; }
|
bool isPrimaryIO() const { return m_primaryIO; }
|
||||||
bool isPrimaryIn() const { return isPrimaryIO() && isInput(); }
|
bool isPrimaryIn() const { return isPrimaryIO() && isInput(); }
|
||||||
bool isIO() const { return (m_input||m_output); }
|
bool isIO() const { return (m_input||m_output); }
|
||||||
|
bool isIfaceRef() const { return (varType()==AstVarType::IFACEREF); }
|
||||||
|
bool isIfaceParent() const { return m_isIfaceParent; }
|
||||||
bool isSignal() const { return varType().isSignal(); }
|
bool isSignal() const { return varType().isSignal(); }
|
||||||
bool isTemp() const { return (varType()==AstVarType::BLOCKTEMP || varType()==AstVarType::MODULETEMP
|
bool isTemp() const { return (varType()==AstVarType::BLOCKTEMP || varType()==AstVarType::MODULETEMP
|
||||||
|| varType()==AstVarType::STMTTEMP || varType()==AstVarType::XTEMP); }
|
|| varType()==AstVarType::STMTTEMP || varType()==AstVarType::XTEMP); }
|
||||||
@@ -975,6 +1036,8 @@ public:
|
|||||||
bool isSc() const { return m_sc; }
|
bool isSc() const { return m_sc; }
|
||||||
bool isScQuad() const;
|
bool isScQuad() const;
|
||||||
bool isScBv() const;
|
bool isScBv() const;
|
||||||
|
bool isScUint() const;
|
||||||
|
bool isScBigUint() const;
|
||||||
bool isScSensitive() const { return m_scSensitive; }
|
bool isScSensitive() const { return m_scSensitive; }
|
||||||
bool isSigPublic() const;
|
bool isSigPublic() const;
|
||||||
bool isSigModPublic() const { return m_sigModPublic; }
|
bool isSigModPublic() const { return m_sigModPublic; }
|
||||||
@@ -1073,7 +1136,7 @@ public:
|
|||||||
,m_name(name) ,m_aboveScopep(aboveScopep) ,m_aboveCellp(aboveCellp), m_modp(modp) {}
|
,m_name(name) ,m_aboveScopep(aboveScopep) ,m_aboveCellp(aboveCellp), m_modp(modp) {}
|
||||||
ASTNODE_NODE_FUNCS(Scope, SCOPE)
|
ASTNODE_NODE_FUNCS(Scope, SCOPE)
|
||||||
virtual void cloneRelink();
|
virtual void cloneRelink();
|
||||||
virtual bool broken() const;
|
virtual const char* broken() const;
|
||||||
virtual bool maybePointedTo() const { return true; }
|
virtual bool maybePointedTo() const { return true; }
|
||||||
virtual string name() const { return m_name; } // * = Scope name
|
virtual string name() const { return m_name; } // * = Scope name
|
||||||
virtual void name(const string& name) { m_name = name; }
|
virtual void name(const string& name) { m_name = name; }
|
||||||
@@ -1127,8 +1190,8 @@ public:
|
|||||||
UASSERT(m_scopep->clonep(), "No clone cross link: "<<this);
|
UASSERT(m_scopep->clonep(), "No clone cross link: "<<this);
|
||||||
m_scopep = m_scopep->clonep()->castScope();
|
m_scopep = m_scopep->clonep()->castScope();
|
||||||
}}
|
}}
|
||||||
virtual bool broken() const { return ( (m_varp && !m_varp->brokeExists())
|
virtual const char* broken() const { BROKEN_RTN(m_varp && !m_varp->brokeExists());
|
||||||
|| (m_scopep && !m_scopep->brokeExists())); }
|
BROKEN_RTN(m_scopep && !m_scopep->brokeExists()); return NULL; }
|
||||||
virtual bool maybePointedTo() const { return true; }
|
virtual bool maybePointedTo() const { return true; }
|
||||||
virtual string name() const {return scopep()->name()+"->"+varp()->name();} // * = Var name
|
virtual string name() const {return scopep()->name()+"->"+varp()->name();} // * = Var name
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
@@ -1210,17 +1273,18 @@ private:
|
|||||||
int m_pinNum; // Pin number
|
int m_pinNum; // Pin number
|
||||||
string m_name; // Pin name, or "" for number based interconnect
|
string m_name; // Pin name, or "" for number based interconnect
|
||||||
AstVar* m_modVarp; // Input/output this pin connects to on submodule.
|
AstVar* m_modVarp; // Input/output this pin connects to on submodule.
|
||||||
|
bool m_param; // Pin connects to parameter
|
||||||
bool m_svImplicit; // Pin is SystemVerilog .name'ed
|
bool m_svImplicit; // Pin is SystemVerilog .name'ed
|
||||||
public:
|
public:
|
||||||
AstPin(FileLine* fl, int pinNum, const string& name, AstNode* exprp)
|
AstPin(FileLine* fl, int pinNum, const string& name, AstNode* exprp)
|
||||||
:AstNode(fl)
|
:AstNode(fl)
|
||||||
,m_name(name), m_svImplicit(false) {
|
,m_name(name), m_param(false), m_svImplicit(false) {
|
||||||
m_pinNum = pinNum;
|
m_pinNum = pinNum;
|
||||||
m_modVarp = NULL;
|
m_modVarp = NULL;
|
||||||
setNOp1p(exprp);
|
setNOp1p(exprp);
|
||||||
}
|
}
|
||||||
AstPin(FileLine* fl, int pinNum, AstVarRef* varname, AstNode* exprp)
|
AstPin(FileLine* fl, int pinNum, AstVarRef* varname, AstNode* exprp)
|
||||||
:AstNode(fl), m_svImplicit(false) {
|
:AstNode(fl), m_param(false), m_svImplicit(false) {
|
||||||
m_name = varname->name();
|
m_name = varname->name();
|
||||||
m_pinNum = pinNum;
|
m_pinNum = pinNum;
|
||||||
m_modVarp = NULL;
|
m_modVarp = NULL;
|
||||||
@@ -1228,7 +1292,7 @@ public:
|
|||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(Pin, PIN)
|
ASTNODE_NODE_FUNCS(Pin, PIN)
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual bool broken() const { return (m_modVarp && !m_modVarp->brokeExists()); }
|
virtual const char* broken() const { BROKEN_RTN(m_modVarp && !m_modVarp->brokeExists()); return NULL; }
|
||||||
virtual string name() const { return m_name; } // * = Pin name, ""=go by number
|
virtual string name() const { return m_name; } // * = Pin name, ""=go by number
|
||||||
virtual void name(const string& name) { m_name = name; }
|
virtual void name(const string& name) { m_name = name; }
|
||||||
bool dotStar() const { return name() == ".*"; } // Special fake name for .* connections until linked
|
bool dotStar() const { return name() == ".*"; } // Special fake name for .* connections until linked
|
||||||
@@ -1237,10 +1301,31 @@ public:
|
|||||||
AstNode* exprp() const { return op1p()->castNode(); } // op1 = Expression connected to pin, NULL if unconnected
|
AstNode* exprp() const { return op1p()->castNode(); } // op1 = Expression connected to pin, NULL if unconnected
|
||||||
AstVar* modVarp() const { return m_modVarp; } // [After Link] Pointer to variable
|
AstVar* modVarp() const { return m_modVarp; } // [After Link] Pointer to variable
|
||||||
void modVarp(AstVar* varp) { m_modVarp=varp; }
|
void modVarp(AstVar* varp) { m_modVarp=varp; }
|
||||||
bool svImplicit() const { return m_svImplicit; }
|
bool param() const { return m_param; }
|
||||||
|
void param(bool flag) { m_param=flag; }
|
||||||
|
bool svImplicit() const { return m_svImplicit; }
|
||||||
void svImplicit(bool flag) { m_svImplicit=flag; }
|
void svImplicit(bool flag) { m_svImplicit=flag; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AstArg : public AstNode {
|
||||||
|
// An argument to a function/task
|
||||||
|
private:
|
||||||
|
string m_name; // Pin name, or "" for number based interconnect
|
||||||
|
public:
|
||||||
|
AstArg(FileLine* fl, const string& name, AstNode* exprp)
|
||||||
|
: AstNode(fl)
|
||||||
|
,m_name(name) {
|
||||||
|
setNOp1p(exprp);
|
||||||
|
}
|
||||||
|
ASTNODE_NODE_FUNCS(Arg, ARG)
|
||||||
|
virtual string name() const { return m_name; } // * = Pin name, ""=go by number
|
||||||
|
virtual void name(const string& name) { m_name = name; }
|
||||||
|
virtual V3Hash sameHash() const { return V3Hash(); }
|
||||||
|
void exprp(AstNode* nodep) { addOp1p(nodep); }
|
||||||
|
AstNode* exprp() const { return op1p()->castNode(); } // op1 = Expression connected to pin, NULL if unconnected
|
||||||
|
bool emptyConnectNoNext() const { return !exprp() && name()=="" && !nextp(); }
|
||||||
|
};
|
||||||
|
|
||||||
struct AstModule : public AstNodeModule {
|
struct AstModule : public AstNodeModule {
|
||||||
// A module declaration
|
// A module declaration
|
||||||
AstModule(FileLine* fl, const string& name)
|
AstModule(FileLine* fl, const string& name)
|
||||||
@@ -1284,7 +1369,7 @@ public:
|
|||||||
AstPackageImport(FileLine* fl, AstPackage* packagep, const string& name)
|
AstPackageImport(FileLine* fl, AstPackage* packagep, const string& name)
|
||||||
: AstNode (fl), m_name(name), m_packagep(packagep) {}
|
: AstNode (fl), m_name(name), m_packagep(packagep) {}
|
||||||
ASTNODE_NODE_FUNCS(PackageImport, PACKAGEIMPORT)
|
ASTNODE_NODE_FUNCS(PackageImport, PACKAGEIMPORT)
|
||||||
virtual bool broken() const { return (!m_packagep || !m_packagep->brokeExists()); }
|
virtual const char* broken() const { BROKEN_RTN(!m_packagep || !m_packagep->brokeExists()); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) m_packagep = m_packagep->clonep()->castPackage(); }
|
virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) m_packagep = m_packagep->clonep()->castPackage(); }
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual string name() const { return m_name; }
|
virtual string name() const { return m_name; }
|
||||||
@@ -1292,6 +1377,72 @@ public:
|
|||||||
void packagep(AstPackage* nodep) { m_packagep=nodep; }
|
void packagep(AstPackage* nodep) { m_packagep=nodep; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AstIface : public AstNodeModule {
|
||||||
|
// A module declaration
|
||||||
|
AstIface(FileLine* fl, const string& name)
|
||||||
|
: AstNodeModule (fl,name) { }
|
||||||
|
ASTNODE_NODE_FUNCS(Iface, IFACE)
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AstModportFTaskRef : public AstNode {
|
||||||
|
// An import/export referenced under a modport
|
||||||
|
// The storage for the function itself is inside the interface/instantiator, thus this is a reference
|
||||||
|
// PARENT: AstModport
|
||||||
|
private:
|
||||||
|
string m_name; // Name of the variable referenced
|
||||||
|
bool m_export; // Type of the function (import/export)
|
||||||
|
AstNodeFTask* m_ftaskp; // Link to the function
|
||||||
|
public:
|
||||||
|
AstModportFTaskRef(FileLine* fl, const string& name, bool isExport)
|
||||||
|
: AstNode(fl), m_name(name), m_export(isExport), m_ftaskp(NULL) { }
|
||||||
|
ASTNODE_NODE_FUNCS(ModportFTaskRef, MODPORTFTASKREF)
|
||||||
|
virtual const char* broken() const { BROKEN_RTN(m_ftaskp && !m_ftaskp->brokeExists()); return NULL; }
|
||||||
|
virtual void dump(ostream& str);
|
||||||
|
virtual string name() const { return m_name; }
|
||||||
|
virtual void cloneRelink() { if (m_ftaskp && m_ftaskp->clonep()) m_ftaskp = m_ftaskp->clonep()->castNodeFTask(); }
|
||||||
|
bool isImport() const { return !m_export; }
|
||||||
|
bool isExport() const { return m_export; }
|
||||||
|
AstNodeFTask* ftaskp() const { return m_ftaskp; } // [After Link] Pointer to variable
|
||||||
|
void ftaskp(AstNodeFTask* ftaskp) { m_ftaskp=ftaskp; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AstModportVarRef : public AstNode {
|
||||||
|
// A input/output/etc variable referenced under a modport
|
||||||
|
// The storage for the variable itself is inside the interface, thus this is a reference
|
||||||
|
// PARENT: AstModport
|
||||||
|
private:
|
||||||
|
string m_name; // Name of the variable referenced
|
||||||
|
AstVarType m_type; // Type of the variable (in/out)
|
||||||
|
AstVar* m_varp; // Link to the actual Var
|
||||||
|
public:
|
||||||
|
AstModportVarRef(FileLine* fl, const string& name, AstVarType::en type)
|
||||||
|
: AstNode(fl), m_name(name), m_type(type), m_varp(NULL) { }
|
||||||
|
ASTNODE_NODE_FUNCS(ModportVarRef, MODPORTVARREF)
|
||||||
|
virtual const char* broken() const { BROKEN_RTN(m_varp && !m_varp->brokeExists()); return NULL; }
|
||||||
|
virtual void dump(ostream& str);
|
||||||
|
virtual void cloneRelink() { if (m_varp && m_varp->clonep()) m_varp = m_varp->clonep()->castVar(); }
|
||||||
|
virtual string name() const { return m_name; }
|
||||||
|
AstVarType varType() const { return m_type; } // * = Type of variable
|
||||||
|
bool isInput() const { return (varType()==AstVarType::INPUT || varType()==AstVarType::INOUT); }
|
||||||
|
bool isOutput() const { return (varType()==AstVarType::OUTPUT || varType()==AstVarType::INOUT); }
|
||||||
|
AstVar* varp() const { return m_varp; } // [After Link] Pointer to variable
|
||||||
|
void varp(AstVar* varp) { m_varp=varp; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AstModport : public AstNode {
|
||||||
|
// A modport in an interface
|
||||||
|
private:
|
||||||
|
string m_name; // Name of the modport
|
||||||
|
public:
|
||||||
|
AstModport(FileLine* fl, const string& name, AstNode* varsp)
|
||||||
|
: AstNode(fl), m_name(name) {
|
||||||
|
addNOp1p(varsp); }
|
||||||
|
virtual string name() const { return m_name; }
|
||||||
|
virtual bool maybePointedTo() const { return true; }
|
||||||
|
ASTNODE_NODE_FUNCS(Modport, MODPORT)
|
||||||
|
AstNode* varsp() const { return op1p(); } // op1 = List of Vars
|
||||||
|
};
|
||||||
|
|
||||||
struct AstCell : public AstNode {
|
struct AstCell : public AstNode {
|
||||||
// A instantiation cell or interface call (don't know which until link)
|
// A instantiation cell or interface call (don't know which until link)
|
||||||
private:
|
private:
|
||||||
@@ -1299,17 +1450,18 @@ private:
|
|||||||
string m_origName; // Original name before dot addition
|
string m_origName; // Original name before dot addition
|
||||||
string m_modName; // Module the cell instances
|
string m_modName; // Module the cell instances
|
||||||
AstNodeModule* m_modp; // [AfterLink] Pointer to module instanced
|
AstNodeModule* m_modp; // [AfterLink] Pointer to module instanced
|
||||||
|
bool m_hasIfaceVar; // True if a Var has been created for this cell
|
||||||
public:
|
public:
|
||||||
AstCell(FileLine* fl, const string& instName, const string& modName,
|
AstCell(FileLine* fl, const string& instName, const string& modName,
|
||||||
AstPin* pinsp, AstPin* paramsp, AstRange* rangep)
|
AstPin* pinsp, AstPin* paramsp, AstRange* rangep)
|
||||||
: AstNode(fl)
|
: AstNode(fl)
|
||||||
, m_name(instName), m_origName(instName), m_modName(modName)
|
, m_name(instName), m_origName(instName), m_modName(modName)
|
||||||
, m_modp(NULL) {
|
, m_modp(NULL), m_hasIfaceVar(false) {
|
||||||
addNOp1p(pinsp); addNOp2p(paramsp); setNOp3p(rangep); }
|
addNOp1p(pinsp); addNOp2p(paramsp); setNOp3p(rangep); }
|
||||||
ASTNODE_NODE_FUNCS(Cell, CELL)
|
ASTNODE_NODE_FUNCS(Cell, CELL)
|
||||||
// No cloneRelink, we presume cloneee's want the same module linkages
|
// No cloneRelink, we presume cloneee's want the same module linkages
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual bool broken() const { return (m_modp && !m_modp->brokeExists()); }
|
virtual const char* broken() const { BROKEN_RTN(m_modp && !m_modp->brokeExists()); return NULL; }
|
||||||
virtual bool maybePointedTo() const { return true; }
|
virtual bool maybePointedTo() const { return true; }
|
||||||
// ACCESSORS
|
// ACCESSORS
|
||||||
virtual string name() const { return m_name; } // * = Cell name
|
virtual string name() const { return m_name; } // * = Cell name
|
||||||
@@ -1325,6 +1477,8 @@ public:
|
|||||||
void addPinsp(AstPin* nodep) { addOp1p(nodep); }
|
void addPinsp(AstPin* nodep) { addOp1p(nodep); }
|
||||||
void addParamsp(AstPin* nodep) { addOp2p(nodep); }
|
void addParamsp(AstPin* nodep) { addOp2p(nodep); }
|
||||||
void modp(AstNodeModule* nodep) { m_modp = nodep; }
|
void modp(AstNodeModule* nodep) { m_modp = nodep; }
|
||||||
|
bool hasIfaceVar() const { return m_hasIfaceVar; }
|
||||||
|
void hasIfaceVar(bool flag) { m_hasIfaceVar = flag; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AstCellInline : public AstNode {
|
struct AstCellInline : public AstNode {
|
||||||
@@ -1434,7 +1588,7 @@ public:
|
|||||||
: AstNode(fl), m_packagep(packagep) {}
|
: AstNode(fl), m_packagep(packagep) {}
|
||||||
ASTNODE_NODE_FUNCS(PackageRef, PACKAGEREF)
|
ASTNODE_NODE_FUNCS(PackageRef, PACKAGEREF)
|
||||||
// METHODS
|
// METHODS
|
||||||
virtual bool broken() const { return !m_packagep || !m_packagep->brokeExists(); }
|
virtual const char* broken() const { BROKEN_RTN(!m_packagep || !m_packagep->brokeExists()); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) {
|
virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) {
|
||||||
m_packagep = m_packagep->clonep()->castPackage();
|
m_packagep = m_packagep->clonep()->castPackage();
|
||||||
}}
|
}}
|
||||||
@@ -1617,15 +1771,19 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct AstAlways : public AstNode {
|
struct AstAlways : public AstNode {
|
||||||
AstAlways(FileLine* fl, AstSenTree* sensesp, AstNode* bodysp)
|
VAlwaysKwd m_keyword;
|
||||||
: AstNode(fl) {
|
public:
|
||||||
|
AstAlways(FileLine* fl, VAlwaysKwd keyword, AstSenTree* sensesp, AstNode* bodysp)
|
||||||
|
: AstNode(fl), m_keyword(keyword) {
|
||||||
addNOp1p(sensesp); addNOp2p(bodysp);
|
addNOp1p(sensesp); addNOp2p(bodysp);
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(Always, ALWAYS)
|
ASTNODE_NODE_FUNCS(Always, ALWAYS)
|
||||||
//
|
//
|
||||||
|
virtual void dump(ostream& str);
|
||||||
AstSenTree* sensesp() const { return op1p()->castSenTree(); } // op1 = Sensitivity list
|
AstSenTree* sensesp() const { return op1p()->castSenTree(); } // op1 = Sensitivity list
|
||||||
AstNode* bodysp() const { return op2p()->castNode(); } // op2 = Statements to evaluate
|
AstNode* bodysp() const { return op2p()->castNode(); } // op2 = Statements to evaluate
|
||||||
void addStmtp(AstNode* nodep) { addOp2p(nodep); }
|
void addStmtp(AstNode* nodep) { addOp2p(nodep); }
|
||||||
|
VAlwaysKwd keyword() const { return m_keyword; }
|
||||||
// Special accessors
|
// Special accessors
|
||||||
bool isJustOneBodyStmt() const { return bodysp() && !bodysp()->nextp(); }
|
bool isJustOneBodyStmt() const { return bodysp() && !bodysp()->nextp(); }
|
||||||
};
|
};
|
||||||
@@ -1696,13 +1854,23 @@ struct AstAssignW : public AstNodeAssign {
|
|||||||
AstAlways* convertToAlways() {
|
AstAlways* convertToAlways() {
|
||||||
AstNode* lhs1p = lhsp()->unlinkFrBack();
|
AstNode* lhs1p = lhsp()->unlinkFrBack();
|
||||||
AstNode* rhs1p = rhsp()->unlinkFrBack();
|
AstNode* rhs1p = rhsp()->unlinkFrBack();
|
||||||
AstAlways* newp = new AstAlways (fileline(), NULL,
|
AstAlways* newp = new AstAlways (fileline(), VAlwaysKwd::ALWAYS, NULL,
|
||||||
new AstAssign (fileline(), lhs1p, rhs1p));
|
new AstAssign (fileline(), lhs1p, rhs1p));
|
||||||
replaceWith(newp); // User expected to then deleteTree();
|
replaceWith(newp); // User expected to then deleteTree();
|
||||||
return newp;
|
return newp;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AstAssignVarScope : public AstNodeAssign {
|
||||||
|
// Assign two VarScopes to each other
|
||||||
|
AstAssignVarScope(FileLine* fileline, AstNode* lhsp, AstNode* rhsp)
|
||||||
|
: AstNodeAssign(fileline, lhsp, rhsp) {
|
||||||
|
dtypeFrom(rhsp);
|
||||||
|
}
|
||||||
|
ASTNODE_NODE_FUNCS(AssignVarScope, ASSIGNVARSCOPE)
|
||||||
|
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstAssignVarScope(this->fileline(), lhsp, rhsp); }
|
||||||
|
};
|
||||||
|
|
||||||
struct AstPull : public AstNode {
|
struct AstPull : public AstNode {
|
||||||
private:
|
private:
|
||||||
bool m_direction;
|
bool m_direction;
|
||||||
@@ -1789,10 +1957,10 @@ public:
|
|||||||
m_dataDeclp = NULL;
|
m_dataDeclp = NULL;
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(CoverDecl, COVERDECL)
|
ASTNODE_NODE_FUNCS(CoverDecl, COVERDECL)
|
||||||
virtual bool broken() const {
|
virtual const char* broken() const {
|
||||||
if (m_dataDeclp && !m_dataDeclp->brokeExists()) return true;
|
BROKEN_RTN(m_dataDeclp && !m_dataDeclp->brokeExists());
|
||||||
if (m_dataDeclp && m_dataDeclp->m_dataDeclp) v3fatalSrc("dataDeclp should point to real data, not be a list"); // Avoid O(n^2) accessing
|
if (m_dataDeclp && m_dataDeclp->m_dataDeclp) v3fatalSrc("dataDeclp should point to real data, not be a list"); // Avoid O(n^2) accessing
|
||||||
return false; }
|
return NULL; }
|
||||||
virtual void cloneRelink() { if (m_dataDeclp && m_dataDeclp->clonep()) m_dataDeclp = m_dataDeclp->clonep()->castCoverDecl(); }
|
virtual void cloneRelink() { if (m_dataDeclp && m_dataDeclp->clonep()) m_dataDeclp = m_dataDeclp->clonep()->castCoverDecl(); }
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual int instrCount() const { return 1+2*instrCountLd(); }
|
virtual int instrCount() const { return 1+2*instrCountLd(); }
|
||||||
@@ -1830,7 +1998,7 @@ public:
|
|||||||
m_declp = declp;
|
m_declp = declp;
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(CoverInc, COVERINC)
|
ASTNODE_NODE_FUNCS(CoverInc, COVERINC)
|
||||||
virtual bool broken() const { return !declp()->brokeExists(); }
|
virtual const char* broken() const { BROKEN_RTN(!declp()->brokeExists()); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep()->castCoverDecl(); }
|
virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep()->castCoverDecl(); }
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual int instrCount() const { return 1+2*instrCountLd(); }
|
virtual int instrCount() const { return 1+2*instrCountLd(); }
|
||||||
@@ -1981,7 +2149,7 @@ public:
|
|||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(Display, DISPLAY)
|
ASTNODE_NODE_FUNCS(Display, DISPLAY)
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual bool broken() const { return !fmtp(); }
|
virtual const char* broken() const { BROKEN_RTN(!fmtp()); return NULL; }
|
||||||
virtual string verilogKwd() const { return (filep() ? (string)"$f"+(string)displayType().ascii()
|
virtual string verilogKwd() const { return (filep() ? (string)"$f"+(string)displayType().ascii()
|
||||||
: (string)"$"+(string)displayType().ascii()); }
|
: (string)"$"+(string)displayType().ascii()); }
|
||||||
virtual bool isGateOptimizable() const { return false; }
|
virtual bool isGateOptimizable() const { return false; }
|
||||||
@@ -2011,7 +2179,7 @@ struct AstSFormat : public AstNode {
|
|||||||
setOp3p(lhsp);
|
setOp3p(lhsp);
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(SFormat, SFORMAT)
|
ASTNODE_NODE_FUNCS(SFormat, SFORMAT)
|
||||||
virtual bool broken() const { return !fmtp(); }
|
virtual const char* broken() const { BROKEN_RTN(!fmtp()); return NULL; }
|
||||||
virtual string verilogKwd() const { return "$sformat"; }
|
virtual string verilogKwd() const { return "$sformat"; }
|
||||||
virtual string emitVerilog() { V3ERROR_NA; return ""; }
|
virtual string emitVerilog() { V3ERROR_NA; return ""; }
|
||||||
virtual string emitC() { V3ERROR_NA; return ""; }
|
virtual string emitC() { V3ERROR_NA; return ""; }
|
||||||
@@ -2432,7 +2600,7 @@ public:
|
|||||||
m_labelp = labelp;
|
m_labelp = labelp;
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(JumpGo, JUMPGO)
|
ASTNODE_NODE_FUNCS(JumpGo, JUMPGO)
|
||||||
virtual bool broken() const { return !labelp()->brokeExistsAbove(); }
|
virtual const char* broken() const { BROKEN_RTN(!labelp()->brokeExistsAbove()); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_labelp->clonep()) m_labelp = m_labelp->clonep()->castJumpLabel(); }
|
virtual void cloneRelink() { if (m_labelp->clonep()) m_labelp = m_labelp->clonep()->castJumpLabel(); }
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual int instrCount() const { return instrCountBranch(); }
|
virtual int instrCount() const { return instrCountBranch(); }
|
||||||
@@ -2654,28 +2822,18 @@ struct AstTraceDecl : public AstNodeStmt {
|
|||||||
private:
|
private:
|
||||||
string m_showname; // Name of variable
|
string m_showname; // Name of variable
|
||||||
uint32_t m_code; // Trace identifier code; converted to ASCII by trace routines
|
uint32_t m_code; // Trace identifier code; converted to ASCII by trace routines
|
||||||
int m_right; // Property of var the trace details
|
VNumRange m_bitRange; // Property of var the trace details
|
||||||
int m_left; // Property of var the trace details
|
VNumRange m_arrayRange; // Property of var the trace details
|
||||||
uint32_t m_arrayLsb; // Property of var the trace details
|
|
||||||
uint32_t m_arrayMsb; // Property of var the trace details
|
|
||||||
uint32_t m_codeInc; // Code increment
|
uint32_t m_codeInc; // Code increment
|
||||||
public:
|
public:
|
||||||
AstTraceDecl(FileLine* fl, const string& showname, AstVar* varp)
|
AstTraceDecl(FileLine* fl, const string& showname, AstNode* valuep,
|
||||||
|
const VNumRange& bitRange, const VNumRange& arrayRange)
|
||||||
: AstNodeStmt(fl)
|
: AstNodeStmt(fl)
|
||||||
, m_showname(showname) {
|
, m_showname(showname), m_bitRange(bitRange), m_arrayRange(arrayRange) {
|
||||||
dtypeFrom(varp);
|
dtypeFrom(valuep);
|
||||||
m_code = 0;
|
m_code = 0;
|
||||||
m_codeInc = varp->dtypep()->arrayUnpackedElements() * varp->dtypep()->widthWords();
|
m_codeInc = ((arrayRange.ranged() ? arrayRange.elements() : 1)
|
||||||
AstBasicDType* bdtypep = varp->basicp();
|
* valuep->dtypep()->widthWords());
|
||||||
m_left = bdtypep ? bdtypep->left() : 0;
|
|
||||||
m_right = bdtypep ? bdtypep->right() : 0;
|
|
||||||
if (AstUnpackArrayDType* adtypep = varp->dtypeSkipRefp()->castUnpackArrayDType()) {
|
|
||||||
m_arrayLsb = adtypep->lsb();
|
|
||||||
m_arrayMsb = adtypep->msb();
|
|
||||||
} else {
|
|
||||||
m_arrayLsb = 0;
|
|
||||||
m_arrayMsb = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
virtual int instrCount() const { return 100; } // Large...
|
virtual int instrCount() const { return 100; } // Large...
|
||||||
ASTNODE_NODE_FUNCS(TraceDecl, TRACEDECL)
|
ASTNODE_NODE_FUNCS(TraceDecl, TRACEDECL)
|
||||||
@@ -2688,11 +2846,8 @@ public:
|
|||||||
uint32_t code() const { return m_code; }
|
uint32_t code() const { return m_code; }
|
||||||
void code(uint32_t code) { m_code=code; }
|
void code(uint32_t code) { m_code=code; }
|
||||||
uint32_t codeInc() const { return m_codeInc; }
|
uint32_t codeInc() const { return m_codeInc; }
|
||||||
int left() const { return m_left; } // Note msb maybe < lsb if little endian
|
const VNumRange& bitRange() const { return m_bitRange; }
|
||||||
int right() const { return m_right; }
|
const VNumRange& arrayRange() const { return m_arrayRange; }
|
||||||
uint32_t arrayMsb() const { return m_arrayMsb; }
|
|
||||||
uint32_t arrayLsb() const { return m_arrayLsb; }
|
|
||||||
uint32_t arrayWidth() const { if (!arrayMsb()) return 0; return arrayMsb()-arrayLsb()+1; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AstTraceInc : public AstNodeStmt {
|
struct AstTraceInc : public AstNodeStmt {
|
||||||
@@ -2709,7 +2864,7 @@ public:
|
|||||||
addNOp2p(valuep);
|
addNOp2p(valuep);
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(TraceInc, TRACEINC)
|
ASTNODE_NODE_FUNCS(TraceInc, TRACEINC)
|
||||||
virtual bool broken() const { return !declp()->brokeExists(); }
|
virtual const char* broken() const { BROKEN_RTN(!declp()->brokeExists()); return NULL; }
|
||||||
virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep()->castTraceDecl(); }
|
virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep()->castTraceDecl(); }
|
||||||
virtual void dump(ostream& str);
|
virtual void dump(ostream& str);
|
||||||
virtual int instrCount() const { return 10+2*instrCountLd(); }
|
virtual int instrCount() const { return 10+2*instrCountLd(); }
|
||||||
@@ -2746,7 +2901,7 @@ public:
|
|||||||
ASTNODE_NODE_FUNCS(Active, ACTIVE)
|
ASTNODE_NODE_FUNCS(Active, ACTIVE)
|
||||||
virtual void dump(ostream& str=cout);
|
virtual void dump(ostream& str=cout);
|
||||||
virtual string name() const { return m_name; }
|
virtual string name() const { return m_name; }
|
||||||
virtual bool broken() const { return (m_sensesp && !m_sensesp->brokeExists()); }
|
virtual const char* broken() const { BROKEN_RTN(m_sensesp && !m_sensesp->brokeExists()); return NULL; }
|
||||||
virtual void cloneRelink() {
|
virtual void cloneRelink() {
|
||||||
if (m_sensesp->clonep()) {
|
if (m_sensesp->clonep()) {
|
||||||
m_sensesp = m_sensesp->clonep()->castSenTree();
|
m_sensesp = m_sensesp->clonep()->castSenTree();
|
||||||
@@ -3180,6 +3335,20 @@ struct AstCast : public AstNode {
|
|||||||
AstNodeDType* childDTypep() const { return op2p()->castNodeDType(); }
|
AstNodeDType* childDTypep() const { return op2p()->castNodeDType(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AstCastSize : public AstNode {
|
||||||
|
// Cast to specific size; signed/twostate inherited from lower element per IEEE
|
||||||
|
AstCastSize(FileLine* fl, AstNode* lhsp, AstConst* rhsp) : AstNode(fl) {
|
||||||
|
setOp1p(lhsp); setOp2p(rhsp);
|
||||||
|
}
|
||||||
|
ASTNODE_NODE_FUNCS(CastSize, CASTSIZE)
|
||||||
|
virtual string emitVerilog() { return "((%r)'(%l))"; }
|
||||||
|
virtual string emitC() { V3ERROR_NA; return ""; }
|
||||||
|
virtual bool cleanOut() { V3ERROR_NA; return true;} virtual bool cleanLhs() {return true;}
|
||||||
|
virtual bool sizeMattersLhs() {return false;}
|
||||||
|
AstNode* lhsp() const { return op1p(); }
|
||||||
|
AstNode* rhsp() const { return op2p(); }
|
||||||
|
};
|
||||||
|
|
||||||
struct AstCCast : public AstNodeUniop {
|
struct AstCCast : public AstNodeUniop {
|
||||||
// Cast to C-based data type
|
// Cast to C-based data type
|
||||||
private:
|
private:
|
||||||
@@ -3232,6 +3401,7 @@ struct AstFEof : public AstNodeUniop {
|
|||||||
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
|
virtual bool cleanOut() {return true;} virtual bool cleanLhs() {return true;}
|
||||||
virtual bool sizeMattersLhs() {return false;}
|
virtual bool sizeMattersLhs() {return false;}
|
||||||
virtual int instrCount() const { return widthInstrs()*16; }
|
virtual int instrCount() const { return widthInstrs()*16; }
|
||||||
|
virtual bool isPure() const { return false; } // SPECIAL: $display has 'visual' ordering
|
||||||
AstNode* filep() const { return lhsp(); }
|
AstNode* filep() const { return lhsp(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3245,6 +3415,7 @@ struct AstFGetC : public AstNodeUniop {
|
|||||||
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return true;}
|
virtual bool cleanOut() {return false;} virtual bool cleanLhs() {return true;}
|
||||||
virtual bool sizeMattersLhs() {return false;}
|
virtual bool sizeMattersLhs() {return false;}
|
||||||
virtual int instrCount() const { return widthInstrs()*64; }
|
virtual int instrCount() const { return widthInstrs()*64; }
|
||||||
|
virtual bool isPure() const { return false; } // SPECIAL: $display has 'visual' ordering
|
||||||
AstNode* filep() const { return lhsp(); }
|
AstNode* filep() const { return lhsp(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3999,7 +4170,7 @@ struct AstPattern : public AstNodeMath {
|
|||||||
// Parents: AstNodeAssign, AstPattern, ...
|
// Parents: AstNodeAssign, AstPattern, ...
|
||||||
// Children: expression, AstPattern, AstPatReplicate
|
// Children: expression, AstPattern, AstPatReplicate
|
||||||
AstPattern(FileLine* fl, AstNode* itemsp) : AstNodeMath(fl) {
|
AstPattern(FileLine* fl, AstNode* itemsp) : AstNodeMath(fl) {
|
||||||
addNOp1p(itemsp);
|
addNOp2p(itemsp);
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(Pattern, PATTERN)
|
ASTNODE_NODE_FUNCS(Pattern, PATTERN)
|
||||||
virtual string emitVerilog() { V3ERROR_NA; return ""; } // Implemented specially
|
virtual string emitVerilog() { V3ERROR_NA; return ""; } // Implemented specially
|
||||||
@@ -4008,7 +4179,11 @@ struct AstPattern : public AstNodeMath {
|
|||||||
virtual string emitSimpleOperator() { V3ERROR_NA; return "";}
|
virtual string emitSimpleOperator() { V3ERROR_NA; return "";}
|
||||||
virtual bool cleanOut() {V3ERROR_NA; return "";}
|
virtual bool cleanOut() {V3ERROR_NA; return "";}
|
||||||
virtual int instrCount() const { return widthInstrs(); }
|
virtual int instrCount() const { return widthInstrs(); }
|
||||||
AstNode* itemsp() const { return op1p(); } // op1 = AstPatReplicate, AstPatMember, etc
|
AstNodeDType* getChildDTypep() const { return childDTypep(); }
|
||||||
|
AstNodeDType* childDTypep() const { return op1p()->castNodeDType(); } // op1 = Type assigning to
|
||||||
|
void childDTypep(AstNodeDType* nodep) { setOp1p(nodep); }
|
||||||
|
AstNodeDType* subDTypep() const { return dtypep() ? dtypep() : childDTypep(); }
|
||||||
|
AstNode* itemsp() const { return op2p(); } // op2 = AstPatReplicate, AstPatMember, etc
|
||||||
};
|
};
|
||||||
struct AstPatMember : public AstNodeMath {
|
struct AstPatMember : public AstNodeMath {
|
||||||
// Verilog '{a} or '{a{b}}
|
// Verilog '{a} or '{a{b}}
|
||||||
@@ -4330,7 +4505,7 @@ public:
|
|||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(CFunc, CFUNC)
|
ASTNODE_NODE_FUNCS(CFunc, CFUNC)
|
||||||
virtual string name() const { return m_name; }
|
virtual string name() const { return m_name; }
|
||||||
virtual bool broken() const { return ( (m_scopep && !m_scopep->brokeExists())); }
|
virtual const char* broken() const { BROKEN_RTN((m_scopep && !m_scopep->brokeExists())); return NULL; }
|
||||||
virtual bool maybePointedTo() const { return true; }
|
virtual bool maybePointedTo() const { return true; }
|
||||||
virtual void dump(ostream& str=cout);
|
virtual void dump(ostream& str=cout);
|
||||||
virtual V3Hash sameHash() const { return V3Hash(); }
|
virtual V3Hash sameHash() const { return V3Hash(); }
|
||||||
@@ -4418,7 +4593,7 @@ public:
|
|||||||
virtual void cloneRelink() { if (m_funcp && m_funcp->clonep()) {
|
virtual void cloneRelink() { if (m_funcp && m_funcp->clonep()) {
|
||||||
m_funcp = m_funcp->clonep()->castCFunc();
|
m_funcp = m_funcp->clonep()->castCFunc();
|
||||||
}}
|
}}
|
||||||
virtual bool broken() const { return (m_funcp && !m_funcp->brokeExists()); }
|
virtual const char* broken() const { BROKEN_RTN(m_funcp && !m_funcp->brokeExists()); return NULL; }
|
||||||
virtual int instrCount() const { return instrCountCall(); }
|
virtual int instrCount() const { return instrCountCall(); }
|
||||||
virtual V3Hash sameHash() const { return V3Hash(funcp()); }
|
virtual V3Hash sameHash() const { return V3Hash(funcp()); }
|
||||||
virtual bool same(AstNode* samep) const {
|
virtual bool same(AstNode* samep) const {
|
||||||
@@ -4550,7 +4725,7 @@ public:
|
|||||||
m_dollarUnitPkgp = NULL;
|
m_dollarUnitPkgp = NULL;
|
||||||
}
|
}
|
||||||
ASTNODE_NODE_FUNCS(Netlist, NETLIST)
|
ASTNODE_NODE_FUNCS(Netlist, NETLIST)
|
||||||
virtual bool broken() const { return (m_dollarUnitPkgp && !m_dollarUnitPkgp->brokeExists()); }
|
virtual const char* broken() const { BROKEN_RTN(m_dollarUnitPkgp && !m_dollarUnitPkgp->brokeExists()); return NULL; }
|
||||||
AstNodeModule* modulesp() const { return op1p()->castNodeModule();} // op1 = List of modules
|
AstNodeModule* modulesp() const { return op1p()->castNodeModule();} // op1 = List of modules
|
||||||
AstNodeModule* topModulep() const { return op1p()->castNodeModule(); } // * = Top module in hierarchy (first one added, for now)
|
AstNodeModule* topModulep() const { return op1p()->castNodeModule(); } // * = Top module in hierarchy (first one added, for now)
|
||||||
void addModulep(AstNodeModule* modulep) { addOp1p(modulep); }
|
void addModulep(AstNodeModule* modulep) { addOp1p(modulep); }
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+3
-3
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -202,8 +202,8 @@ class BrokenCheckVisitor : public AstNVisitor {
|
|||||||
private:
|
private:
|
||||||
virtual void visit(AstNode* nodep, AstNUser*) {
|
virtual void visit(AstNode* nodep, AstNUser*) {
|
||||||
BrokenTable::setUnder(nodep,true);
|
BrokenTable::setUnder(nodep,true);
|
||||||
if (nodep->broken()) {
|
if (const char* whyp=nodep->broken()) {
|
||||||
nodep->v3fatalSrc("Broken link in node (or something without maybePointedTo)");
|
nodep->v3fatalSrc("Broken link in node (or something without maybePointedTo): "<<whyp);
|
||||||
}
|
}
|
||||||
if (nodep->dtypep()) {
|
if (nodep->dtypep()) {
|
||||||
if (!nodep->dtypep()->brokeExists()) { nodep->v3fatalSrc("Broken link in node->dtypep() to "<<(void*)nodep->dtypep()); }
|
if (!nodep->dtypep()->brokeExists()) { nodep->v3fatalSrc("Broken link in node->dtypep() to "<<(void*)nodep->dtypep()); }
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2004-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2004-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2004-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2004-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+2
-2
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -526,7 +526,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sort(report.begin(), report.end());
|
stable_sort(report.begin(), report.end());
|
||||||
for (deque<string>::iterator it = report.begin(); it!=report.end(); ++it) {
|
for (deque<string>::iterator it = report.begin(); it!=report.end(); ++it) {
|
||||||
*ofp << *it;
|
*ofp << *it;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+8
-7
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -87,15 +87,16 @@ private:
|
|||||||
AstVar* varp = vscp->varp();
|
AstVar* varp = vscp->varp();
|
||||||
vscp->v3warn(IMPERFECTSCH,"Imperfect scheduling of variable: "<<vscp);
|
vscp->v3warn(IMPERFECTSCH,"Imperfect scheduling of variable: "<<vscp);
|
||||||
AstUnpackArrayDType* arrayp = varp->dtypeSkipRefp()->castUnpackArrayDType();
|
AstUnpackArrayDType* arrayp = varp->dtypeSkipRefp()->castUnpackArrayDType();
|
||||||
|
AstStructDType *structp = varp->dtypeSkipRefp()->castStructDType();
|
||||||
bool isArray = arrayp;
|
bool isArray = arrayp;
|
||||||
int msb = isArray ? arrayp->msb() : 0;
|
bool isStruct = structp && structp->packedUnsup();
|
||||||
int lsb = isArray ? arrayp->lsb() : 0;
|
int elements = isArray ? arrayp->elementsConst() : 1;
|
||||||
if (isArray && ((msb - lsb + 1) > DETECTARRAY_MAX_INDEXES)) {
|
if (isArray && (elements > DETECTARRAY_MAX_INDEXES)) {
|
||||||
vscp->v3warn(E_DETECTARRAY, "Unsupported: Can't detect more than "<<cvtToStr(DETECTARRAY_MAX_INDEXES)
|
vscp->v3warn(E_DETECTARRAY, "Unsupported: Can't detect more than "<<cvtToStr(DETECTARRAY_MAX_INDEXES)
|
||||||
<<" array indexes (probably with UNOPTFLAT warning suppressed): "<<varp->prettyName()<<endl
|
<<" array indexes (probably with UNOPTFLAT warning suppressed): "<<varp->prettyName()<<endl
|
||||||
<<vscp->warnMore()
|
<<vscp->warnMore()
|
||||||
<<"... Could recompile with DETECTARRAY_MAX_INDEXES increased to at least "<<cvtToStr(msb-lsb+1));
|
<<"... Could recompile with DETECTARRAY_MAX_INDEXES increased to at least "<<cvtToStr(elements));
|
||||||
} else if (!isArray
|
} else if (!isArray && !isStruct
|
||||||
&& !varp->dtypeSkipRefp()->castBasicDType()) {
|
&& !varp->dtypeSkipRefp()->castBasicDType()) {
|
||||||
if (debug()) varp->dumpTree(cout,"-DETECTARRAY-");
|
if (debug()) varp->dumpTree(cout,"-DETECTARRAY-");
|
||||||
vscp->v3warn(E_DETECTARRAY, "Unsupported: Can't detect changes on complex variable (probably with UNOPTFLAT warning suppressed): "<<varp->prettyName());
|
vscp->v3warn(E_DETECTARRAY, "Unsupported: Can't detect changes on complex variable (probably with UNOPTFLAT warning suppressed): "<<varp->prettyName());
|
||||||
@@ -109,7 +110,7 @@ private:
|
|||||||
m_topModp->addStmtp(newvarp);
|
m_topModp->addStmtp(newvarp);
|
||||||
AstVarScope* newvscp = new AstVarScope(vscp->fileline(), m_scopetopp, newvarp);
|
AstVarScope* newvscp = new AstVarScope(vscp->fileline(), m_scopetopp, newvarp);
|
||||||
m_scopetopp->addVarp(newvscp);
|
m_scopetopp->addVarp(newvscp);
|
||||||
for (int index=lsb; index<=msb; ++index) {
|
for (int index=0; index<elements; ++index) {
|
||||||
AstChangeDet* changep
|
AstChangeDet* changep
|
||||||
= new AstChangeDet (vscp->fileline(),
|
= new AstChangeDet (vscp->fileline(),
|
||||||
aselIfNeeded(isArray, index,
|
aselIfNeeded(isArray, index,
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+2
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2008-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2008-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -684,6 +684,7 @@ class GaterVisitor : public GaterBaseVisitor {
|
|||||||
AstNode* bodyp = nodep->bodysp()->cloneTree(true);
|
AstNode* bodyp = nodep->bodysp()->cloneTree(true);
|
||||||
|
|
||||||
AstAlways* alwp = new AstAlways(nodep->fileline(),
|
AstAlways* alwp = new AstAlways(nodep->fileline(),
|
||||||
|
nodep->keyword(),
|
||||||
sensesp,
|
sensesp,
|
||||||
bodyp);
|
bodyp);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+5
-9
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -346,14 +346,10 @@ private:
|
|||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
// Link to global function
|
// Link to global function
|
||||||
if (nodep->formCallTree()) {
|
if (nodep->formCallTree()) {
|
||||||
if (nodep->name() == "_final") {
|
UINFO(4, " formCallTree "<<nodep<<endl);
|
||||||
UINFO(4, " formCallTree "<<nodep<<endl);
|
AstCCall* callp = new AstCCall(nodep->fileline(), nodep);
|
||||||
AstCCall* callp = new AstCCall(nodep->fileline(), nodep);
|
callp->argTypes("vlSymsp");
|
||||||
callp->argTypes("vlSymsp");
|
m_finalFuncp->addStmtsp(callp);
|
||||||
m_finalFuncp->addStmtsp(callp);
|
|
||||||
} else {
|
|
||||||
nodep->v3fatalSrc("Unknown CFunc name. Make code more generic, with a map of func names");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual void visit(AstSenTree* nodep, AstNUser*) {
|
virtual void visit(AstSenTree* nodep, AstNUser*) {
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2010-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2010-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2010-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2010-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+13
-4
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -815,9 +815,10 @@ private:
|
|||||||
|
|
||||||
bool varNotReferenced(AstNode* nodep, AstVar* varp, int level=0) {
|
bool varNotReferenced(AstNode* nodep, AstVar* varp, int level=0) {
|
||||||
// Return true if varp never referenced under node.
|
// Return true if varp never referenced under node.
|
||||||
// Return false if referenced, or tree too deep to be worth it
|
// Return false if referenced, or tree too deep to be worth it, or side effects
|
||||||
if (!nodep) return true;
|
if (!nodep) return true;
|
||||||
if (level>2) return false;
|
if (level>2) return false;
|
||||||
|
if (nodep->isPure()) return false; // For example a $fgetc can't be reordered
|
||||||
if (nodep->castNodeVarRef() && nodep->castNodeVarRef()->varp()==varp) return false;
|
if (nodep->castNodeVarRef() && nodep->castNodeVarRef()->varp()==varp) return false;
|
||||||
return (varNotReferenced (nodep->nextp(),varp,level+1)
|
return (varNotReferenced (nodep->nextp(),varp,level+1)
|
||||||
&& varNotReferenced(nodep->op1p(),varp,level+1)
|
&& varNotReferenced(nodep->op1p(),varp,level+1)
|
||||||
@@ -1230,6 +1231,8 @@ private:
|
|||||||
&& ((!m_params // Can reduce constant wires into equations
|
&& ((!m_params // Can reduce constant wires into equations
|
||||||
&& m_doNConst
|
&& m_doNConst
|
||||||
&& v3Global.opt.oConst()
|
&& v3Global.opt.oConst()
|
||||||
|
&& !(nodep->varp()->isFuncLocal() // Default value, not a "known" constant for this usage
|
||||||
|
&& nodep->varp()->isInput())
|
||||||
&& !nodep->varp()->isSigPublic())
|
&& !nodep->varp()->isSigPublic())
|
||||||
|| nodep->varp()->isParam())) {
|
|| nodep->varp()->isParam())) {
|
||||||
AstConst* constp = nodep->varp()->valuep()->castConst();
|
AstConst* constp = nodep->varp()->valuep()->castConst();
|
||||||
@@ -1413,7 +1416,7 @@ private:
|
|||||||
for (AstNodeSenItem* senp = nodep->sensesp()->castNodeSenItem(); senp; senp=senp->nextp()->castNodeSenItem()) {
|
for (AstNodeSenItem* senp = nodep->sensesp()->castNodeSenItem(); senp; senp=senp->nextp()->castNodeSenItem()) {
|
||||||
vec.push_back(senp);
|
vec.push_back(senp);
|
||||||
}
|
}
|
||||||
sort(vec.begin(), vec.end(), SenItemCmp());
|
stable_sort(vec.begin(), vec.end(), SenItemCmp());
|
||||||
for (vector<AstNodeSenItem*>::iterator it=vec.begin(); it!=vec.end(); ++it) {
|
for (vector<AstNodeSenItem*>::iterator it=vec.begin(); it!=vec.end(); ++it) {
|
||||||
(*it)->unlinkFrBack();
|
(*it)->unlinkFrBack();
|
||||||
}
|
}
|
||||||
@@ -1466,6 +1469,9 @@ private:
|
|||||||
virtual void visit(AstAssignAlias* nodep, AstNUser*) {
|
virtual void visit(AstAssignAlias* nodep, AstNUser*) {
|
||||||
// Don't perform any optimizations, keep the alias around
|
// Don't perform any optimizations, keep the alias around
|
||||||
}
|
}
|
||||||
|
virtual void visit(AstAssignVarScope* nodep, AstNUser*) {
|
||||||
|
// Don't perform any optimizations, the node won't be linked yet
|
||||||
|
}
|
||||||
virtual void visit(AstAssignW* nodep, AstNUser*) {
|
virtual void visit(AstAssignW* nodep, AstNUser*) {
|
||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
if (m_doNConst && replaceNodeAssign(nodep)) return;
|
if (m_doNConst && replaceNodeAssign(nodep)) return;
|
||||||
@@ -1640,7 +1646,10 @@ private:
|
|||||||
replaceWithSimulation(nodep);
|
replaceWithSimulation(nodep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
virtual void visit(AstArg* nodep, AstNUser*) {
|
||||||
|
// replaceWithSimulation on the Arg's parent FuncRef replaces these
|
||||||
|
nodep->iterateChildren(*this);
|
||||||
|
}
|
||||||
virtual void visit(AstWhile* nodep, AstNUser*) {
|
virtual void visit(AstWhile* nodep, AstNUser*) {
|
||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
if (m_doNConst) {
|
if (m_doNConst) {
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+54
-6
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -64,6 +64,7 @@ private:
|
|||||||
bool m_checkBlock; // Should this block get covered?
|
bool m_checkBlock; // Should this block get covered?
|
||||||
AstNodeModule* m_modp; // Current module to add statement to
|
AstNodeModule* m_modp; // Current module to add statement to
|
||||||
bool m_inToggleOff; // In function/task etc
|
bool m_inToggleOff; // In function/task etc
|
||||||
|
bool m_inModOff; // In module with no coverage
|
||||||
FileMap m_fileps; // Column counts for each fileline
|
FileMap m_fileps; // Column counts for each fileline
|
||||||
string m_beginHier; // AstBegin hier name for user coverage points
|
string m_beginHier; // AstBegin hier name for user coverage points
|
||||||
|
|
||||||
@@ -124,9 +125,11 @@ private:
|
|||||||
// VISITORS - BOTH
|
// VISITORS - BOTH
|
||||||
virtual void visit(AstNodeModule* nodep, AstNUser*) {
|
virtual void visit(AstNodeModule* nodep, AstNUser*) {
|
||||||
m_modp = nodep;
|
m_modp = nodep;
|
||||||
|
m_inModOff = nodep->isTop(); // Ignore coverage on top module; it's a shell we created
|
||||||
m_fileps.clear();
|
m_fileps.clear();
|
||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
m_modp = NULL;
|
m_modp = NULL;
|
||||||
|
m_inModOff = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// VISITORS - TOGGLE COVERAGE
|
// VISITORS - TOGGLE COVERAGE
|
||||||
@@ -140,7 +143,7 @@ private:
|
|||||||
}
|
}
|
||||||
virtual void visit(AstVar* nodep, AstNUser*) {
|
virtual void visit(AstVar* nodep, AstNUser*) {
|
||||||
nodep->iterateChildren(*this);
|
nodep->iterateChildren(*this);
|
||||||
if (m_modp && !m_inToggleOff
|
if (m_modp && !m_inModOff && !m_inToggleOff
|
||||||
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageToggle()) {
|
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageToggle()) {
|
||||||
const char* disablep = varIgnoreToggle(nodep);
|
const char* disablep = varIgnoreToggle(nodep);
|
||||||
if (disablep) {
|
if (disablep) {
|
||||||
@@ -210,7 +213,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (AstUnpackArrayDType* adtypep = dtypep->castUnpackArrayDType()) {
|
else if (AstUnpackArrayDType* adtypep = dtypep->castUnpackArrayDType()) {
|
||||||
for (int index_docs=adtypep->lsb(); index_docs<=adtypep->msb()+1; ++index_docs) {
|
for (int index_docs=adtypep->lsb(); index_docs<=adtypep->msb(); ++index_docs) {
|
||||||
int index_code = index_docs - adtypep->lsb();
|
int index_code = index_docs - adtypep->lsb();
|
||||||
ToggleEnt newent (above.m_comment+string("[")+cvtToStr(index_docs)+"]",
|
ToggleEnt newent (above.m_comment+string("[")+cvtToStr(index_docs)+"]",
|
||||||
new AstArraySel(varp->fileline(), above.m_varRefp->cloneTree(true), index_code),
|
new AstArraySel(varp->fileline(), above.m_varRefp->cloneTree(true), index_code),
|
||||||
@@ -221,6 +224,50 @@ private:
|
|||||||
newent.cleanup();
|
newent.cleanup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (AstPackArrayDType* adtypep = dtypep->castPackArrayDType()) {
|
||||||
|
for (int index_docs=adtypep->lsb(); index_docs<=adtypep->msb(); ++index_docs) {
|
||||||
|
AstNodeDType* subtypep = adtypep->subDTypep()->skipRefp();
|
||||||
|
int index_code = index_docs - adtypep->lsb();
|
||||||
|
ToggleEnt newent (above.m_comment+string("[")+cvtToStr(index_docs)+"]",
|
||||||
|
new AstSel(varp->fileline(), above.m_varRefp->cloneTree(true),
|
||||||
|
index_code*subtypep->width(), subtypep->width()),
|
||||||
|
new AstSel(varp->fileline(), above.m_chgRefp->cloneTree(true),
|
||||||
|
index_code*subtypep->width(), subtypep->width()));
|
||||||
|
toggleVarRecurse(adtypep->subDTypep()->skipRefp(), depth+1,
|
||||||
|
newent,
|
||||||
|
varp, chgVarp);
|
||||||
|
newent.cleanup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (AstStructDType* adtypep = dtypep->castStructDType()) {
|
||||||
|
// For now it's packed, so similar to array
|
||||||
|
for (AstMemberDType* itemp = adtypep->membersp(); itemp; itemp=itemp->nextp()->castMemberDType()) {
|
||||||
|
AstNodeDType* subtypep = itemp->subDTypep()->skipRefp();
|
||||||
|
int index_code = itemp->lsb();
|
||||||
|
ToggleEnt newent (above.m_comment+string(".")+itemp->name(),
|
||||||
|
new AstSel(varp->fileline(), above.m_varRefp->cloneTree(true),
|
||||||
|
index_code, subtypep->width()),
|
||||||
|
new AstSel(varp->fileline(), above.m_chgRefp->cloneTree(true),
|
||||||
|
index_code, subtypep->width()));
|
||||||
|
toggleVarRecurse(subtypep, depth+1,
|
||||||
|
newent,
|
||||||
|
varp, chgVarp);
|
||||||
|
newent.cleanup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (AstUnionDType* adtypep = dtypep->castUnionDType()) {
|
||||||
|
// Arbitrarially handle only the first member of the union
|
||||||
|
if (AstMemberDType* itemp = adtypep->membersp()) {
|
||||||
|
AstNodeDType* subtypep = itemp->subDTypep()->skipRefp();
|
||||||
|
ToggleEnt newent (above.m_comment+string(".")+itemp->name(),
|
||||||
|
above.m_varRefp->cloneTree(true),
|
||||||
|
above.m_chgRefp->cloneTree(true));
|
||||||
|
toggleVarRecurse(subtypep, depth+1,
|
||||||
|
newent,
|
||||||
|
varp, chgVarp);
|
||||||
|
newent.cleanup();
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
dtypep->v3fatalSrc("Unexpected node data type in toggle coverage generation: "<<dtypep->prettyTypeName());
|
dtypep->v3fatalSrc("Unexpected node data type in toggle coverage generation: "<<dtypep->prettyTypeName());
|
||||||
}
|
}
|
||||||
@@ -231,7 +278,7 @@ private:
|
|||||||
UINFO(4," IF: "<<nodep<<endl);
|
UINFO(4," IF: "<<nodep<<endl);
|
||||||
if (m_checkBlock) {
|
if (m_checkBlock) {
|
||||||
nodep->ifsp()->iterateAndNext(*this);
|
nodep->ifsp()->iterateAndNext(*this);
|
||||||
if (m_checkBlock
|
if (m_checkBlock && !m_inModOff
|
||||||
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageLine()) { // if a "if" branch didn't disable it
|
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageLine()) { // if a "if" branch didn't disable it
|
||||||
if (!nodep->backp()->castIf()
|
if (!nodep->backp()->castIf()
|
||||||
|| nodep->backp()->castIf()->elsesp()!=nodep) { // Ignore if else; did earlier
|
|| nodep->backp()->castIf()->elsesp()!=nodep) { // Ignore if else; did earlier
|
||||||
@@ -243,7 +290,7 @@ private:
|
|||||||
if (nodep->elsesp()) {
|
if (nodep->elsesp()) {
|
||||||
m_checkBlock = true;
|
m_checkBlock = true;
|
||||||
nodep->elsesp()->iterateAndNext(*this);
|
nodep->elsesp()->iterateAndNext(*this);
|
||||||
if (m_checkBlock
|
if (m_checkBlock && !m_inModOff
|
||||||
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageLine()) { // if a "else" branch didn't disable it
|
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageLine()) { // if a "else" branch didn't disable it
|
||||||
UINFO(4," COVER: "<<nodep<<endl);
|
UINFO(4," COVER: "<<nodep<<endl);
|
||||||
if (nodep->elsesp()->castIf()) {
|
if (nodep->elsesp()->castIf()) {
|
||||||
@@ -258,7 +305,7 @@ private:
|
|||||||
}
|
}
|
||||||
virtual void visit(AstCaseItem* nodep, AstNUser*) {
|
virtual void visit(AstCaseItem* nodep, AstNUser*) {
|
||||||
UINFO(4," CASEI: "<<nodep<<endl);
|
UINFO(4," CASEI: "<<nodep<<endl);
|
||||||
if (m_checkBlock
|
if (m_checkBlock && !m_inModOff
|
||||||
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageLine()) {
|
&& nodep->fileline()->coverageOn() && v3Global.opt.coverageLine()) {
|
||||||
nodep->bodysp()->iterateAndNext(*this);
|
nodep->bodysp()->iterateAndNext(*this);
|
||||||
if (m_checkBlock) { // if the case body didn't disable it
|
if (m_checkBlock) { // if the case body didn't disable it
|
||||||
@@ -327,6 +374,7 @@ public:
|
|||||||
m_checkBlock = true;
|
m_checkBlock = true;
|
||||||
m_beginHier = "";
|
m_beginHier = "";
|
||||||
m_inToggleOff = false;
|
m_inToggleOff = false;
|
||||||
|
m_inModOff = true;
|
||||||
rootp->iterateChildren(*this);
|
rootp->iterateChildren(*this);
|
||||||
}
|
}
|
||||||
virtual ~CoverageVisitor() {}
|
virtual ~CoverageVisitor() {}
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+4
-2
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -103,7 +103,9 @@ private:
|
|||||||
}
|
}
|
||||||
void checkDType(AstNodeDType* nodep) {
|
void checkDType(AstNodeDType* nodep) {
|
||||||
if (!nodep->generic() // Don't remove generic types
|
if (!nodep->generic() // Don't remove generic types
|
||||||
&& m_elimDTypes) { // dtypes stick around until post-widthing
|
&& m_elimDTypes // dtypes stick around until post-widthing
|
||||||
|
&& !nodep->castMemberDType() // Keep member names iff upper type exists
|
||||||
|
) {
|
||||||
m_varEtcsp.push_back(nodep);
|
m_varEtcsp.push_back(nodep);
|
||||||
}
|
}
|
||||||
if (AstNode* subnodep = nodep->virtRefDTypep()) subnodep->user1Inc();
|
if (AstNode* subnodep = nodep->virtRefDTypep()) subnodep->user1Inc();
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+4
-4
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
@@ -124,10 +124,10 @@ private:
|
|||||||
AstVar* varp;
|
AstVar* varp;
|
||||||
AstNodeModule* addmodp = oldvarscp->scopep()->modp();
|
AstNodeModule* addmodp = oldvarscp->scopep()->modp();
|
||||||
// We need a new AstVar, but only one for all scopes, to match the new AstVarScope
|
// We need a new AstVar, but only one for all scopes, to match the new AstVarScope
|
||||||
VarMap::iterator iter = m_modVarMap.find(make_pair(addmodp,name));
|
VarMap::iterator it = m_modVarMap.find(make_pair(addmodp,name));
|
||||||
if (iter != m_modVarMap.end()) {
|
if (it != m_modVarMap.end()) {
|
||||||
// Created module's AstVar earlier under some other scope
|
// Created module's AstVar earlier under some other scope
|
||||||
varp = iter->second;
|
varp = it->second;
|
||||||
} else {
|
} else {
|
||||||
if (width==0) {
|
if (width==0) {
|
||||||
varp = new AstVar (oldvarscp->fileline(), AstVarType::BLOCKTEMP, name, oldvarscp->varp());
|
varp = new AstVar (oldvarscp->fileline(), AstVarType::BLOCKTEMP, name, oldvarscp->varp());
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
//
|
//
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//
|
//
|
||||||
// Copyright 2003-2013 by Wilson Snyder. This program is free software; you can
|
// Copyright 2003-2014 by Wilson Snyder. This program is free software; you can
|
||||||
// redistribute it and/or modify it under the terms of either the GNU
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
// Lesser General Public License Version 3 or the Perl Artistic License
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
// Version 2.0.
|
// Version 2.0.
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user