Compare commits

...
149 Commits
Author SHA1 Message Date
Wilson Snyder b4a7e4697e Version bump 2016-07-30 10:10:35 -04:00
Wilson Snyder cd61b1d045 Usage check. 2016-07-30 10:05:55 -04:00
Wilson Snyder 24dc36ba4c Fix comparison of unpacked arrays, bug1071. 2016-07-23 16:58:30 -04:00
Wilson Snyder e8e4f1777d Internals: Add cloneType method. Unused - for next checkin. 2016-07-23 16:54:36 -04:00
Wilson Snyder ae38a26af3 Internals: Cleanup some slice code. No functional change. 2016-07-21 23:07:22 -04:00
Wilson Snyder 8ee94dd7aa Tests: Smaller verilated test. 2016-07-21 23:03:54 -04:00
Wilson Snyder e741a29d36 Commentary 2016-07-13 22:51:40 -04:00
Wilson Snyder be1d275151 Fix Ubuntu 16.04 test failures. 2016-07-12 21:43:16 -04:00
David Horton 31c9e26e2e Fix compiler warning in GCC 6.
Signed-off-by: Wilson Snyder <[email protected]>
2016-07-09 04:09:34 -04:00
Wilson Snyder 20ed1ada03 Spelling fixes. 2016-07-09 03:31:22 -04:00
Wilson Snyder 891214fa72 Fix enum values of 11-16 bits wide using .next/.prev, bug1062. 2016-06-15 22:46:34 -04:00
Wilson Snyder e819e285e2 Fix false warnings on non-power-2 enums using .next/.prev. 2016-06-15 20:13:52 -04:00
Wilson Snyder 171c175e54 devel release 2016-05-18 21:15:33 -04:00
Wilson Snyder 675cbce8cb Version bump 2016-05-18 21:10:56 -04:00
Wilson Snyder 4f1398f773 Add commandArgsAdd, msg1890. 2016-05-16 22:04:21 -04:00
Wilson Snyder ae89e399a3 Fix to string, msg1890. 2016-05-16 21:57:49 -04:00
Wilson Snyder 2c9716c64c Try 2. Fix core dump on Arch Linux/GCC 6.1.1, bug1058. 2016-05-16 21:40:49 -04:00
Wilson Snyder bc58245abf Fix core dump on Arch Linux/GCC 6.1.1, bug1058. 2016-05-14 17:56:04 -04:00
Johan Bjork 8c4aa8517e Fix --output-split of constructors, bug1035.
Signed-off-by: Wilson Snyder <[email protected]>
2016-05-12 07:19:02 -04:00
Johan Bjork c0b7a54bb9 Fix removal of empty packages, modules and cells, bug1034.
Signed-off-by: Wilson Snyder <[email protected]>
2016-05-11 21:44:55 -04:00
Wilson Snyder 6b32bb635d Change --l2-name default to remove 'v' naming. 2016-05-07 14:10:33 -04:00
Wilson Snyder 691de22ae3 Add --l2-name option for controlling 'v' naming, bug1050. 2016-05-07 14:01:02 -04:00
Wilson Snyder e64b2d3372 Internals: user#inc now has optional increment value. 2016-05-06 22:26:15 -04:00
Johan Bjork e190af9d87 Avoid extra clean ANDs after CCalls.
Signed-off-by: Wilson Snyder <[email protected]>
2016-05-06 21:18:48 -04:00
Johan Bjork 8d14463b18 Fix emitting public enumerations.
Signed-off-by: Wilson Snyder <[email protected]>
2016-05-05 22:48:53 -04:00
Wilson Snyder 04977ef721 Internals: Show clocker in debug dumps. Part of bug1009. 2016-05-05 22:40:19 -04:00
Wilson Snyder d84e6875c5 Test case 2016-04-06 19:18:59 -04:00
Wilson Snyder 80678ae7bc Fix clang 3.8.0 warnings. 2016-03-31 22:26:49 -04:00
Stefan Wallentowitz 482bdab0e0 Support command-line -G/+pvalue param overrides, bug1045.
Signed-off-by: Wilson Snyder <[email protected]>
2016-03-24 19:14:15 -04:00
Stefan Wallentowitz b2623b9841 Internals: Add success parameter to parseDouble. No functional change intended.
Signed-off-by: Wilson Snyder <[email protected]>
2016-03-23 07:48:32 -04:00
Wilson Snyder 9ae40d64f0 Support parameter type, bug376. 2016-03-14 21:51:31 -04:00
Wilson Snyder cef097b7b7 Internals: Refactoring prep for parameter type branch. No functional change intended. 2016-03-12 20:54:52 -05:00
Wilson Snyder b840334ad2 devel release 2016-03-01 19:14:04 -05:00
Wilson Snyder acff683e8e Version bump 2016-03-01 19:12:14 -05:00
Stefan Wallentowitz c5332de86d Support SV strings to readmemh, bug1040.
Signed-off-by: Wilson Snyder <[email protected]>
2016-03-01 18:57:15 -05:00
Wilson Snyder 90ecf14a0a Fix pattern assignment width propagation, bug1037. 2016-02-21 23:00:21 -05:00
Wilson Snyder 4945282369 Fix slicing mix of big and little-endian, bug1033. 2016-02-09 22:16:12 -05:00
Wilson Snyder ca532d23f0 Suppress null compares to avoid compile errors until bug1030 fixed 2016-02-08 22:16:05 -05:00
Wilson Snyder a509b6a21c Internals: Fix compares to null, ongoing part of bug1030. No functional change intended. 2016-02-08 22:15:44 -05:00
Wilson Snyder 46229473cb Fix crash on very deep function trees, bug1028. 2016-02-04 20:47:55 -05:00
Johan Bjork 65be2448dc Fix elaboration-time display warnings, bug1032.
Signed-off-by: Wilson Snyder <[email protected]>
2016-02-04 18:38:59 -05:00
Johan Bjork be74806044 Fix read-after-free error detected by valgrind, bug1031.
Signed-off-by: Wilson Snyder <[email protected]>
2016-02-04 18:34:08 -05:00
Wilson Snyder b488666c1e Fix cppcheck 1.71 issues. No functional change intended. 2016-02-04 18:30:21 -05:00
Wilson Snyder d1acaea611 Internals: Fix compares to null, ongoing part of bug1030. No functional change intended. 2016-02-03 20:44:31 -05:00
Wilson Snyder db6e5ce7cf Internals: Misc code cleanups. No functional change. 2016-02-03 20:43:05 -05:00
Wilson Snyder d56179df17 Internals: Fix compares to null, part of bug1030. No functional change intended. 2016-02-02 21:02:00 -05:00
Wilson Snyder 850100c9c2 Fix compares to null, part of bug1030. 2016-02-02 19:35:44 -05:00
Wilson Snyder 0725999f0a flexfix: Match Verilog-perl fix for new gcc. 2016-02-02 19:32:17 -05:00
Johan Bjork cb2d8259f2 Fix stats and debug print, bug1029
Signed-off-by: Wilson Snyder <[email protected]>
2016-01-28 22:20:31 -05:00
Johan Bjork 61a1f3d817 Support inlining interfaces, bug1018.
Signed-off-by: Wilson Snyder <[email protected]>
2016-01-21 19:11:53 -05:00
Johan Bjork 63f111b7f3 Fix unrolling complicated for-loop bounds, bug677.
Signed-off-by: Wilson Snyder <[email protected]>
2016-01-21 19:00:19 -05:00
Wilson Snyder e061eb3003 Fix using short parameter names on negative params, bug1022. 2016-01-20 22:09:11 -05:00
Johan Bjork 29daa58222 Fix stats file containing multiple unroll entries, bug1020.
Signed-off-by: Wilson Snyder <[email protected]>
2016-01-06 20:53:48 -05:00
Johan Bjork 340cc02171 Avoid dynamic_cast for classes with no children, bug1021.
Signed-off-by: Wilson Snyder <[email protected]>
2016-01-06 20:47:44 -05:00
Wilson Snyder b738d1960a Copyright year update 2016-01-06 20:36:41 -05:00
Wilson Snyder 38f5b780d7 devel release 2016-01-06 20:33:25 -05:00
Wilson Snyder fa9dac29e8 Version bump 2015-12-19 10:26:14 -05:00
Wilson Snyder afc432042f Fix ternary operation with unpacked array, bug1017. 2015-12-18 18:02:25 -05:00
Wilson Snyder 21cb29baf0 Fix arrayed instances to unpacked of same size, bug1015. Fix slices of unpacked arrays with non-zero LSBs. 2015-12-15 22:37:49 -05:00
Wilson Snyder e8b5001cfe Fix model restore crash, bug1013. 2015-12-14 19:58:22 -05:00
Wilson Snyder 849c1e46a2 Fix constant propagation, bug1012. 2015-12-08 22:22:42 -05:00
Wilson Snyder ebad6cde36 Fix error instead of warning on large concat, msg1768. 2015-12-08 21:25:43 -05:00
Johan Bjork f920b3945e Fix dotted generated array error, bug1005.
Signed-off-by: Wilson Snyder <[email protected]>
2015-12-05 19:58:58 -05:00
Wilson Snyder 178028a70a Commentary; part of last commit 2015-12-05 19:45:45 -05:00
Todd Strader 5e54d3e41a Fix interface inside generate, bug1001, bug1003.
Signed-off-by: Wilson Snyder <[email protected]>
2015-12-05 19:39:40 -05:00
Wilson Snyder f0af8726e3 Internals: Fix some spacing. No functional change. 2015-12-05 17:12:03 -05:00
Todd Strader 57f2fe77ea Fix cell [#] to mean # cells.
Signed-off-by: Wilson Snyder <[email protected]>
2015-12-01 18:23:11 -05:00
Todd Strader d56ca25089 Tests: Fix false hidden module warning.
Signed-off-by: Wilson Snyder <[email protected]>
2015-12-01 18:17:26 -05:00
Wilson Snyder d39ce17dea Makefiles: Turn off make built-in suffixes. 2015-11-28 17:33:01 -05:00
Johan Bjork 373a68ec8b Fix dtype indexing into arrays, bug1007.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-24 21:34:07 -05:00
Johan Bjork 5613758ee3 Fix array slicing of non-const indexes, bug1006.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-24 21:28:04 -05:00
Johan Bjork 2102f86909 Fix genvar constant propagation, bug1003.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-22 21:16:13 -05:00
Wilson Snyder d5ea785de7 Commentary; last commit was bug1004 2015-11-22 21:13:16 -05:00
Johan Bjork 9edd28d2ed Fix genvar constant propagation from package, bug1003.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-22 20:46:26 -05:00
Wilson Snyder 7698af5178 Tests 2015-11-14 20:53:36 -05:00
Wilson Snyder 52ae451f5c Fix interface inside generate, bug998. 2015-11-14 09:06:09 -05:00
Wilson Snyder 9254443cd4 Fix casts under generates, bug999. 2015-11-12 22:29:42 -05:00
Johan Bjork 4e4bc7b90f Fix constant function assigned to packed structs, bug997.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-11 20:49:45 -05:00
Johan Bjork c7e0f2e196 Fix function calls on arrayed interface, bug994.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-11 20:40:24 -05:00
Wilson Snyder acabaab6ac Internals: Avoid tristate coredump. 2015-11-11 20:37:52 -05:00
Wilson Snyder b0a249f338 Fix display %u, %v, %p, %z, bug989. 2015-11-10 21:12:15 -05:00
Wilson Snyder 0cb5d5cc5a Internals: Upgrade some C strings to C++ 2015-11-10 18:59:48 -05:00
Wilson Snyder 9208c87f91 Tests: Better upper-case display formats. 2015-11-10 07:09:53 -05:00
Johan Bjork 0081ce4a75 Fix size-changing cast on packed struct, bug993.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-06 19:12:17 -05:00
Todd Strader 7850f49963 Fix t_scope_map --verbose test, bug955.
Signed-off-by: Wilson Snyder <[email protected]>
2015-11-06 18:58:48 -05:00
Wilson Snyder c72ee41142 Add z to param values to avoid conflicts. 2015-11-05 07:00:04 -05:00
Wilson Snyder bf5dee955d Fix real parameters causing bad module names, bug992. 2015-11-04 22:01:21 -05:00
Wilson Snyder 3df23a148a devel release 2015-11-01 08:20:17 -05:00
Wilson Snyder 0a1b55c296 Version bump 2015-11-01 08:18:54 -05:00
Wilson Snyder 14b8efe4bb Version bump 2015-11-01 08:14:44 -05:00
Wilson Snyder 64162efebd Fix commit 379bfd06, crash in commandArgsPlusMatch 2015-11-01 08:14:18 -05:00
Wilson Snyder faf5e1de51 Internals: Remove some unneeded c_str() calls. No functional change. 2015-10-29 22:19:51 -04:00
Wilson Snyder 0d7b1a7dc7 Remove VlCovCvtToCStr to avoid scary scope issues. 2015-10-29 21:58:00 -04:00
Wilson Snyder fa63bc6b78 Fix error message on missing interface, bug985. 2015-10-29 21:44:02 -04:00
Wilson Snyder 379bfd062f Fix crash in commandArgsPlusMatch, bug987. 2015-10-29 21:07:49 -04:00
Jamey Hicks 49108c23f0 Support with non-format arguments, bug467.
Signed-off-by: Wilson Snyder <[email protected]>
2015-10-27 20:58:31 -04:00
Wilson Snyder 4475060268 Ignore %l in , bug983. 2015-10-27 20:37:52 -04:00
Wilson Snyder 4f269e336d With --bbox-ignore, don't warn about always order. 2015-10-24 07:24:53 -04:00
Wilson Snyder 4464b13163 Fix dot indexing into arrayed inferfaces, bug978. 2015-10-23 23:06:24 -04:00
Wilson Snyder 215d5f68b0 Fix struct.enum.name method calls, bug855. 2015-10-23 22:57:15 -04:00
Wilson Snyder 281f4e04ee Fix $fwrite to constant stderr/stdout, bug961. 2015-10-23 21:53:16 -04:00
Wilson Snyder 17a3f9691d Fix package:scope.scope variable references. 2015-10-23 21:03:35 -04:00
Wilson Snyder 4fde6ee7af Support elaboration assertions, bug973. 2015-10-23 18:13:25 -04:00
Wilson Snyder 040b1b06d5 Support genvar indexes into arrayed cells, bug517. 2015-10-22 20:13:49 -04:00
Wilson Snyder b16ea8b719 Tests: With --benchmark, don't time directory change. 2015-10-21 06:54:03 -04:00
Wilson Snyder cc22847bc3 For --xml, decrease block indent to 2 spaces. 2015-10-20 21:22:00 -04:00
Johan Bjork 3702e17b2e Backout bug978 fix as is incomplete.
Signed-off-by: Wilson Snyder <[email protected]>
2015-10-10 07:54:45 -04:00
Wilson Snyder 7abc220fb3 Fix C++ 2014 compile warnings. No functional change. 2015-10-04 13:41:45 -04:00
Wilson Snyder 4fc9a906f6 Internals: Fix cppcheck warnings; add VL_DANGLING. No functional change. 2015-10-04 13:16:35 -04:00
Wilson Snyder 5de83c9805 Internals: Fix cppcheck warnings. No functional change. 2015-10-04 13:11:32 -04:00
Johan Bjork f71d904a9b Fix internal error on interface array, bug978.
Signed-off-by: Wilson Snyder <[email protected]>
2015-10-04 11:17:58 -04:00
Wilson Snyder 318ded4198 Internals: Cleanup cppcheck warnings. 2015-10-03 22:33:06 -04:00
Wilson Snyder f1874b211f Support , bug977. 2015-10-03 07:12:56 -04:00
Wilson Snyder c60ffd7fd9 Fix enum constant propagation, bug970. 2015-10-01 21:15:01 -04:00
Todd Strader dc57282168 Internal: Fix setBit from earlier commit, bug971.
Signed-off-by: Wilson Snyder <[email protected]>
2015-09-30 07:02:39 -04:00
Todd Strader 3c336e179f Fix structure parameter constant propagation, bug968.
Signed-off-by: Wilson Snyder <[email protected]>
2015-09-29 21:02:33 -04:00
Todd Strader 6bda57da5d Internals: Fix setBit not clearing X mask.
Signed-off-by: Wilson Snyder <[email protected]>
2015-09-29 20:59:17 -04:00
Wilson Snyder 9a16001e51 Add --vpi flag, and fix VPI linkage, bug969. 2015-09-25 22:57:28 -04:00
Todd Strader 34870e899f Add VerilatedScopeNameMap for introspection, bug966.
Signed-off-by: Wilson Snyder <[email protected]>
2015-09-24 21:08:58 -04:00
Wilson Snyder d0653f72e2 Fix very long module names, bug937. 2015-09-19 20:12:35 -04:00
Wilson Snyder 64748b7b1d Internals: Replace FNV hashes with SHA1 2015-09-19 18:49:54 -04:00
Wilson Snyder 7163c8d048 Fix internal error on dotted refs into generates, bug958. 2015-09-18 20:57:27 -04:00
Wilson Snyder d0ec991bb2 Fix mis-optimizing public DPI functions, bug963. 2015-09-18 19:06:15 -04:00
Wilson Snyder d458af4454 Commentary, bug965. 2015-09-11 20:18:41 -04:00
Wilson Snyder 9e9e7c33ae Install commentary, msg1678. 2015-09-03 21:20:19 -04:00
Wilson Snyder ce7de5ed30 Commentary, bug951 2015-08-16 11:48:05 -04:00
Wilson Snyder 776d8edf52 devel release 2015-08-12 21:42:08 -04:00
Wilson Snyder 5f21385e41 Version bump - commentary fix 2015-08-12 21:40:55 -04:00
Wilson Snyder 94fed93f54 Version bump 2015-08-12 21:34:59 -04:00
Wilson Snyder a950e4816d Support extraction of enum bits, bug951. 2015-08-12 21:33:40 -04:00
Wilson Snyder c87c66efb1 Fix size casts as second argument of cast item, bug950. 2015-08-12 19:37:25 -04:00
Jie Xu 5a5a0006fe Fix parameters with function parameter arguments, bug952.
Signed-off-by: Wilson Snyder <[email protected]>
2015-08-12 19:29:06 -04:00
Wilson Snyder 60b48a6830 Fix coverage documentation, bug954. 2015-08-12 19:18:58 -04:00
Wilson Snyder 5e41350588 Fix makefile with --coverage, bug953. 2015-08-12 19:06:15 -04:00
Wilson Snyder ff9f5b62ac bug951 testcase 2015-08-12 08:36:23 -04:00
Wilson Snyder 882913f0ca Add tracing_on, etc to vlt files, bug932. 2015-07-22 20:14:58 -04:00
Wilson Snyder 2062f7e97b Fix hashed error with typedef inside block, bug948. 2015-07-22 19:52:11 -04:00
Wilson Snyder 445c83a60d Fix with SV string, bug947. 2015-07-21 18:36:27 -04:00
Wilson Snyder 1891cfd79a Fix rounding in trace , bug946. 2015-07-21 13:22:08 -04:00
Wilson Snyder 06d5a7b2bf Internals: Allow hashing nulls; misc cleanup 2015-07-06 19:37:20 -04:00
Wilson Snyder 5af8a8aa4c Internals: Hash nulls 2015-07-05 20:31:30 -04:00
Wilson Snyder dc6b085d8b Fix MinGW compiler error, bug927. 2015-06-21 21:01:02 -04:00
Wilson Snyder 00759f777e Fix dpi imports inside generates. 2015-06-16 19:27:18 -04:00
Wilson Snyder 95ac0e61b2 Fix MinGW compiler error, bug927. 2015-06-16 07:13:45 -04:00
Wilson Snyder 6c5884853f Fix string-to-int space conversion, bug931. 2015-06-12 07:28:44 -04:00
Wilson Snyder 7578ef889f Fix .c files to be treated as .cpp, bug930. 2015-06-09 07:28:51 -04:00
Wilson Snyder da254af8d5 Fix MinGW compiler error, bug929. 2015-06-08 07:24:04 -04:00
Wilson Snyder 98123dc422 Verison fix 2015-06-06 14:02:06 -04:00
Wilson Snyder 466909b3d9 devel release 2015-06-06 14:00:23 -04:00
468 changed files with 9706 additions and 3282 deletions
+167 -3
View File
@@ -3,7 +3,171 @@ 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.873 2015-06-06
* Verilator 3.886 2016-07-30
**** Fix enum values of 11-16 bits wide using .next/.prev, bug1062. [Brian Flachs]
**** Fix false warnings on non-power-2 enums using .next/.prev.
**** Fix comparison of unpacked arrays, bug1071. [Andrew Bardsley]
**** Fix compiler warning in GCC 6. [David Horton]
* Verilator 3.884 2016-05-18
** Support parameter type, bug376. [Alan Hunter, et al]
** Support command-line -G/+pvalue param overrides, bug1045. [Stefan Wallentowitz]
*** The default l2 scope name is now the same as the top-level module, bug1050.
Use "--l2-name v" for the historical behavior.
*** Add --l2-name option for controlling "v" naming.
**** Fix --output-split of constructors, bug1035. [Johan Bjork]
**** Fix removal of empty packages, modules and cells, bug1034. [Johan Bjork]
**** Fix core dump on Arch Linux/GCC 6.1.1, bug1058. [Jannis Harder]
**** Fix $value$plusargs to string, msg1890. [Frederic Requin]
* Verilator 3.882 2016-03-01
**** Internal Verilation-time performance enhancements, bug1021. [Johan Bjork]
**** Support inlining interfaces, bug1018. [Johan Bjork]
**** Support SV strings to readmemh, bug1040. [Stefan Wallentowitz]
**** Fix unrolling complicated for-loop bounds, bug677. [Johan Bjork]
**** Fix stats file containing multiple unroll entries, bug1020. [Johan Bjork]
**** Fix using short parameter names on negative params, bug1022. [Duraid Madina]
**** Fix read-after-free error, bug1031. [Johan Bjork]
**** Fix elaboration-time display warnings, bug1032. [Johan Bjork]
**** Fix crash on very deep function trees, bug1028. [Jonathan Kimmitt]
**** Fix slicing mix of big and little-endian, bug1033. [Geoff Barrett]
**** Fix pattern assignment width propagation, bug1037. [Johan Bjork]
* Verilator 3.880 2015-12-19
*** Support display %u, %v, %p, %z, bug989. [Johan Bjork]
**** Fix real parameters causing bad module names, bug992. [Johan Bjork]
**** Fix size-changing cast on packed struct, bug993. [Johan Bjork]
**** Fix function calls on arrayed interface, bug994. [Johan Bjork]
**** Fix arrayed interfaces, bug879, bug1001. [Todd Strader]
**** Fix constant function assigned to packed structs, bug997. [Johan Bjork]
**** Fix interface inside generate, bug998. [Johan Bjork]
**** Fix $signed casts under generates, bug999. [Clifford Wolf]
**** Fix genvar constant propagation, bug1003. [Johan Bjork]
**** Fix parameter constant propagation from package, bug1004. [Johan Bjork]
**** Fix array slicing of non-const indexes, bug1006. [Johan Bjork]
**** Fix dotted generated array error, bug1005. [Jeff Bush, Johan Bjork]
**** Fix error instead of warning on large concat, msg1768. [Paul Rolfe]
**** Fix $bitstoreal constant propagation, bug1012. [Jonathan Kimmitt]
**** Fix model restore crash, bug1013. [Jason McMullan]
**** Fix arrayed instances to unpacked of same size, bug1015. [Varun Koyyalagunta]
**** Fix slices of unpacked arrays with non-zero LSBs.
**** Fix ternary operation with unpacked array, bug1017. [Varun Koyyalagunta].
* Verilator 3.878 2015-11-01
** Add --vpi flag, and fix VPI linkage, bug969. [Arthur Kahlich]
** Support genvar indexes into arrayed cells, bug517. [Todd Strader]
** Support $sformatf, bug977. [Johan Bjork]
*** Support elaboration assertions, bug973. [Johan Bjork]
*** Support $display with non-format arguments, bug467. [Jamey Hicks]
**** Add VerilatedScopeNameMap for introspection, bug966. [Todd Strader]
**** Ignore %l in $display, bug983. [Todd Strader]
**** Fix very long module names, bug937. [Todd Strader]
**** Fix internal error on dotted refs into generates, bug958. [Jie Xu]
**** Fix structure parameter constant propagation, bug968. [Todd Strader]
**** Fix enum constant propagation, bug970. [Todd Strader]
**** Fix mis-optimizing public DPI functions, bug963. [Wei Song]
**** Fix package:scope.scope variable references.
**** Fix $fwrite to constant stderr/stdout, bug961. [Wei Song]
**** Fix struct.enum.name method calls, bug855. [Jonathon Donaldson]
**** Fix dot indexing into arrayed inferfaces, bug978. [Johan Bjork]
**** Fix crash in commandArgsPlusMatch, bug987. [Jamie Iles]
**** Fix error message on missing interface, bug985. [Todd Strader]
* Verilator 3.876 2015-08-12
*** Add tracing_on, etc to vlt files, bug932. [Frederic Requin]
**** Support extraction of enum bits, bug951. [Jonathon Donaldson]
**** Fix MinGW compiler error, bug927, bug929. [Hans Tichelaar]
**** Fix .c files to be treated as .cpp, bug930. [Jonathon Donaldson]
**** Fix string-to-int space conversion, bug931. [Fabrizio Ferrandi]
**** Fix dpi imports inside generates. [Michael Tresidder]
**** Fix rounding in trace $timescale, bug946. [Frederic Requin]
**** Fix $fopen with SV string, bug947. [Sven Stucki]
**** Fix hashed error with typedef inside block, bug948. [Sven Stucki]
**** Fix makefile with --coverage, bug953. [Eivind Liland]
**** Fix coverage documentation, bug954. [Thomas J Whatson]
**** Fix parameters with function parameter arguments, bug952. [Jie Xu]
**** Fix size casts as second argument of cast item, bug950. [Jonathon Donaldson]
* Verilator 3.874 2015-06-06
*** Add pkg-config .pc file, bug919. [Stefan Wallentowitz] *** Add pkg-config .pc file, bug919. [Stefan Wallentowitz]
@@ -2572,12 +2736,12 @@ 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-2015 by Wilson Snyder. This program is free software; you Copyright 2001-2016 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.
Local variables: Local variables:
mode: outline mode: outline
paragraph-separate: "[ \f\n]*$" paragraph-separate: "[ \f\n]*$"
end: end:
+3 -1
View File
@@ -7,7 +7,7 @@
# #
#***************************************************************************** #*****************************************************************************
# #
# Copyright 2003-2015 by Wilson Snyder. This program is free software; you can # Copyright 2003-2016 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.
@@ -100,6 +100,8 @@ PACKAGE_VERSION = @PACKAGE_VERSION@
#### End of system configuration section. #### #### End of system configuration section. ####
###################################################################### ######################################################################
.SUFFIXES:
SHELL = /bin/sh SHELL = /bin/sh
SUBDIRS = src test_verilated test_c test_sc test_regress SUBDIRS = src test_verilated test_c test_sc test_regress
+3 -2
View File
@@ -11,7 +11,7 @@ This is the Verilator package README file.
http://www.veripool.org/verilator http://www.veripool.org/verilator
This package is Copyright 2003-2015 by Wilson Snyder. (Report bugs to This package is Copyright 2003-2016 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
@@ -117,9 +117,10 @@ and add it to path using Modules/modulecmd:
After installing you'll want a module file like the following: After installing you'll want a module file like the following:
set install_root /CAD_DISK/verilator/{version-number-used-above} set install_root /CAD_DISK/verilator/{version-number-used-above}
setenv VERILATOR_ROOT $install_root unsetenv VERILATOR_ROOT
prepend-path PATH $install_root/bin prepend-path PATH $install_root/bin
prepend-path MANPATH $install_root/man prepend-path MANPATH $install_root/man
prepend-path PKG_CONFIG_PATH $install_root/share/pkgconfig
=item 3. =item 3.
+1 -1
View File
@@ -1,6 +1,6 @@
// DESCRIPTION: Verilator: List of To Do issues. // DESCRIPTION: Verilator: List of To Do issues.
// //
// Copyright 2004-2015 by Wilson Snyder. This program is free software; you can // Copyright 2004-2016 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.
+158 -53
View File
@@ -3,7 +3,7 @@ eval 'exec perl -wS $0 ${1+"$@"}'
if 0; if 0;
###################################################################### ######################################################################
# #
# Copyright 2003-2015 by Wilson Snyder. This program is free software; you # Copyright 2003-2016 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.
@@ -54,7 +54,18 @@ push @ARGV, (split ' ',$ENV{VERILATOR_TEST_FLAGS}||"");
# We sneak a look at the flags so we can do some pre-environment checks # We sneak a look at the flags so we can do some pre-environment checks
# All flags will hit verilator... # All flags will hit verilator...
foreach my $sw (@ARGV) { foreach my $sw (@ARGV) {
$sw = "'$sw'" if $sw =~ m![^---a-zA-Z0-9_/\\:.+]!; # Some special treatment for parameters to allow verilog literals for numbers
if ((substr($sw, 0, 2) eq "-G") || (substr($sw, 0, 8) eq "-pvalue+")) {
# If there is a single quote in the parameter put it double quotes ,
# else just put it in double quotes
if ($sw =~ m![\']!) {
$sw = "\"$sw\"";
} else {
$sw = "'$sw'";
}
} else {
$sw = "'$sw'" if $sw =~ m![^---a-zA-Z0-9_/\\:.+]!;
}
push @Opt_Verilator_Sw, $sw; push @Opt_Verilator_Sw, $sw;
} }
@@ -269,6 +280,7 @@ descriptions in the next sections for more information.
--exe Link to create executable --exe Link to create executable
-F <file> Parse options from a file, relatively -F <file> Parse options from a file, relatively
-f <file> Parse options from a file -f <file> Parse options from a file
-G<name>=<value> Overwrite toplevel parameter
--gdb Run Verilator under GDB interactively --gdb Run Verilator under GDB interactively
--gdbbt Run Verilator under GDB for backtrace --gdbbt Run Verilator under GDB for backtrace
--help Display this help --help Display this help
@@ -279,6 +291,7 @@ descriptions in the next sections for more information.
--inline-mult <value> Tune module inlining --inline-mult <value> Tune module inlining
-LDFLAGS <flags> Linker pre-object flags for makefile -LDFLAGS <flags> Linker pre-object flags for makefile
-LDLIBS <flags> Linker library flags for makefile -LDLIBS <flags> Linker library flags for makefile
--l2-name <value> Verilog scope name of the top module
--language <lang> Default language standard to parse --language <lang> Default language standard to parse
+libext+<ext>+[ext]... Extensions for finding modules +libext+<ext>+[ext]... Extensions for finding modules
--lint-only Lint, but do not make output --lint-only Lint, but do not make output
@@ -308,6 +321,7 @@ descriptions in the next sections for more information.
--profile-cfuncs Name functions for profiling --profile-cfuncs Name functions for profiling
--private Debugging; see docs --private Debugging; see docs
--public Debugging; see docs --public Debugging; see docs
-pvalue+<name>=<value> Overwrite toplevel parameter
--report-unoptflat Extra diagnostics for UNOPTFLAT --report-unoptflat Extra diagnostics for UNOPTFLAT
--savable Enable model save-restore --savable Enable model save-restore
--sc Create SystemC output --sc Create SystemC output
@@ -331,6 +345,7 @@ descriptions in the next sections for more information.
-v <filename> Verilog library -v <filename> Verilog library
+verilog1995ext+<ext> Synonym for +1364-1995ext+<ext> +verilog1995ext+<ext> Synonym for +1364-1995ext+<ext>
+verilog2001ext+<ext> Synonym for +1364-2001ext+<ext> +verilog2001ext+<ext> Synonym for +1364-2001ext+<ext>
--vpi Enable VPI compiles
-Werror-<message> Convert warning to error -Werror-<message> Convert warning to error
-Wfuture-<message> Disable unknown message warnings -Wfuture-<message> Disable unknown message warnings
-Wno-<message> Disable warning -Wno-<message> Disable warning
@@ -471,14 +486,14 @@ Verilator will mark the signal as clocker and propagate the clocker attribute
automatically to other signals derived from that. In this way, Verilator will automatically to other signals derived from that. In this way, Verilator will
try to avoid taking the clocker signal into checking list. try to avoid taking the clocker signal into checking list.
Note signal-name is specified by the RTL hiearchy path. For example, v.foo.bar. Note signal-name is specified by the RTL hierarchy path. For example, v.foo.bar.
If the signal is the input to top-module, the directly the signal name. If you If the signal is the input to top-module, the directly the signal name. If you
find it difficult to find the exact name, try to use C</*verilator clocker*/> in find it difficult to find the exact name, try to use C</*verilator clocker*/> in
RTL file to mark the signal directly. RTL file to mark the signal directly.
=item --compiler I<compiler-name> =item --compiler I<compiler-name>
Enables tunings and work-arounds for the specified C++ compiler. Enables tunings and workarounds for the specified C++ compiler.
=over 4 =over 4
@@ -591,8 +606,8 @@ alias for GCC compatibility.
=item --debug =item --debug
Select the debug built image of Verilator (if available), and enable more Select the debug built image of Verilator (if available), and enable more
internal assertions (equivelent to C<--debug-check>), debugging messages internal assertions (equivalent to C<--debug-check>), debugging messages
(equivelent to C<--debugi 4>), and intermediate form dump files (equivilent (equivalent to C<--debugi 4>), and intermediate form dump files (equivalent
to C<--dump-treei 3>). to C<--dump-treei 3>).
=item --debug-check =item --debug-check
@@ -687,6 +702,35 @@ The file may contain // comments which are ignored to the end of the line.
Any $VAR, $(VAR), or ${VAR} will be replaced with the specified environment Any $VAR, $(VAR), or ${VAR} will be replaced with the specified environment
variable. variable.
=item -GI<name>=I<value>
Overwrites the given parameter of the toplevel module. The value is limited
to basic data literals:
=over 4
=item Verilog integer literals
The standard verilog integer literals are supported, so values like 32'h8,
2'b00, 4 etc. are allowed. Care must be taken that the single quote (I') is
properly escaped in an interactive shell, e.g., as -GWIDTH=8\'hx.
=item C integer literals
It is also possible to use C integer notation, including hexadecimal (0x..),
octal (0..) or binary (0b..) notation.
=item Double literals
Double literals must contain a dot (.) and/or an exponent (e).
=item Strings
String must in double quotes ("). On the command line it is required to escape
them properly, e.g. as -GSTR="\"My String\"" or -GSTR='"My String"'.
=back
=item --gdb =item --gdb
Run Verilator underneath an interactive GDB (or VERILATOR_GDB environment Run Verilator underneath an interactive GDB (or VERILATOR_GDB environment
@@ -742,9 +786,19 @@ called LDLIBS as that's the Makefile variable it controls. (In Make,
LDFLAGS is before the first object, LDLIBS after. -L libraries need to be LDFLAGS is before the first object, LDLIBS after. -L libraries need to be
in the Make variable LDLIBS, not LDFLAGS.) in the Make variable LDLIBS, not LDFLAGS.)
=item --l2-name I<value>
Instead of using the module name when showing Verilog scope, use the name
provided. This allows simplifying some Verilator-embedded modeling
methodologies. Default is an l2-name matching the top module. The default
before 3.884 was "--l2-name v"
For example, the program "module t; initial $display("%m"); endmodule" will
show by default "t". With "--l2-name v" it will print "v".
=item --language I<value> =item --language I<value>
A synonym for C<--default-langauge>, for compatibility with other tools and A synonym for C<--default-language>, for compatibility with other tools and
earlier versions of Verilator. earlier versions of Verilator.
=item +libext+I<ext>+I<ext>... =item +libext+I<ext>+I<ext>...
@@ -872,9 +926,10 @@ Backward compatible alias for "--pins-bv 65". Note that's a 65, not a 64.
Specifies SystemC inputs/outputs of greater than or equal to I<width> bits Specifies SystemC inputs/outputs of greater than or equal to I<width> bits
wide should use sc_bv's instead of uint32/vluint64_t's. The default is wide should use sc_bv's instead of uint32/vluint64_t's. The default is
"--pins-bv 65". Versions before Verilator 3.671 defaulted to "--pins-bv "--pins-bv 65", and the value must be less than or equal to 65. Versions
33". The more sc_bv is used, the worse for performance. Use the before Verilator 3.671 defaulted to "--pins-bv 33". The more sc_bv is
"/*verilator sc_bv*/" attribute to select specific ports to be sc_bv. used, the worse for performance. Use the "/*verilator sc_bv*/" attribute
to select specific ports to be sc_bv.
=item --pins-sc-uint =item --pins-sc-uint
@@ -945,6 +1000,11 @@ 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 -pvalue+I<name>=I<value>
Overwrites the given parameter(s) of the toplevel module. See -G for a
detailed description.
=item --report-unoptflat =item --report-unoptflat
Extra diagnostics for UNOPTFLAT warnings. This includes for each loop, the Extra diagnostics for UNOPTFLAT warnings. This includes for each loop, the
@@ -1103,6 +1163,10 @@ Note -v is fairly standard across Verilog tools.
Synonyms for C<+1364-1995ext+>I<ext> and C<+1364-2001ext+>I<ext> respectively Synonyms for C<+1364-1995ext+>I<ext> and C<+1364-2001ext+>I<ext> respectively
=item --vpi
Enable use of VPI and linking against the verilated_vpi.cpp files.
=item -Wall =item -Wall
Enable all warnings, including code style warnings that are normally Enable all warnings, including code style warnings that are normally
@@ -1335,7 +1399,7 @@ This is an example similar to the above, but using SystemC.
top = new Vour("top"); // SP_CELL (top, Vour); top = new Vour("top"); // SP_CELL (top, Vour);
top->clk(clk); // SP_PIN (top, clk, clk); top->clk(clk); // SP_PIN (top, clk, clk);
while (!Verilated::gotFinish()) { sc_start(1, SC_NS); } while (!Verilated::gotFinish()) { sc_start(1, SC_NS); }
delete top; delete top;
exit(0); exit(0);
} }
EOF EOF
@@ -1598,7 +1662,7 @@ example:
double sc_time_stamp () { // Called by $time in Verilog double sc_time_stamp () { // Called by $time in Verilog
return main_time; // converts to double, to match return main_time; // converts to double, to match
// what SystemC does // what SystemC does
} }
int main(int argc, char** argv) { int main(int argc, char** argv) {
@@ -1802,6 +1866,8 @@ Verilator supports a very limited subset of the VPI. This subset allows
inspection, examination, value change callbacks, and depositing of values inspection, examination, value change callbacks, and depositing of values
to public signals only. to public signals only.
VPI is enabled with the verilator --vpi switch.
To access signals via the VPI, Verilator must be told exactly which signals To access signals via the VPI, Verilator must be told exactly which signals
are to be accessed. This is done using the Verilator public pragmas are to be accessed. This is done using the Verilator public pragmas
documented below. documented below.
@@ -1835,17 +1901,28 @@ changed on the specified clock edge.
There are many online tutorials and books on the VPI, but an example that There are many online tutorials and books on the VPI, but an example that
accesses the above would be: accesses the above would be:
void read_and_check() { void read_and_check() {
vpiHandle vh1 = vpi_handle_by_name((PLI_BYTE8*)"t.readme", NULL); vpiHandle vh1 = vpi_handle_by_name((PLI_BYTE8*)"t.readme", NULL);
if (!vh1) { error... } if (!vh1) { error... }
const char* name = vpi_get_str(vpiName, vh1); const char* name = vpi_get_str(vpiName, vh1);
printf("Module name: %s\n"); // Prints "readme" printf("Module name: %s\n"); // Prints "readme"
s_vpi_value v; s_vpi_value v;
v.format = vpiIntVal; v.format = vpiIntVal;
vpi_get_value(vh1, &v); vpi_get_value(vh1, &v);
printf("Value of v: %d\n", v.value.integer); // Prints "readme" printf("Value of v: %d\n", v.value.integer); // Prints "readme"
} }
For signal callbacks to work the main loop of the program must call
VerilatedVpi::callValueCbs().
#include "verilated_vpi.h" // Required to get definitions
...
while (time passes) {
...
topp->eval();
VerilatedVpi::callValueCbs();
}
=head1 CROSS COMPILATION =head1 CROSS COMPILATION
@@ -1923,30 +2000,40 @@ The grammar of configuration commands is as follows:
Take remaining text up the the next `verilog mode switch and treat it as Take remaining text up the the next `verilog mode switch and treat it as
Verilator configuration commands. Verilator configuration commands.
=item coverage_on [-file "<filename>" [-lines <line> [ - <line> ]]]
=item coverage_off [-file "<filename>" [-lines <line> [ - <line> ]]] =item coverage_off [-file "<filename>" [-lines <line> [ - <line> ]]]
Disable coverage for the specified filename (or wildcard with '*' or '?', Enable/disable coverage for the specified filename (or wildcard with '*' or
or all files if omitted) and range of line numbers (or all lines if '?', or all files if omitted) and range of line numbers (or all lines if
omitted). Often used to ignore an entire module for coverage analysis omitted). Often used to ignore an entire module for coverage analysis
purposes. purposes.
=item lint_on [-msg <message>] [-file "<filename>" [-lines <line> [ - <line>]]]
=item lint_off [-msg <message>] [-file "<filename>" [-lines <line> [ - <line>]]] =item lint_off [-msg <message>] [-file "<filename>" [-lines <line> [ - <line>]]]
Disables the specified lint warning, in the specified filename (or wildcard Enable/disables the specified lint warning, in the specified filename (or
with '*' or '?', or all files if omitted) and range of line numbers (or all wildcard with '*' or '?', or all files if omitted) and range of line
lines if omitted). numbers (or all lines if omitted).
Using '*' will override any lint_on directives in the source, i.e. the With lint_off using '*' will override any lint_on directives in the source,
warning will still not be printed. i.e. the warning will still not be printed.
If the -msg is omitted, all lint warnings are disabled. This will override If the -msg is omitted, all lint warnings are enabled/disabled. This will
all later lint warning enables for the specified region. override all later lint warning enables for the specified region.
=item tracing_on [-file "<filename>" [-lines <line> [ - <line> ]]]
=item tracing_off [-file "<filename>" [-lines <line> [ - <line> ]]] =item tracing_off [-file "<filename>" [-lines <line> [ - <line> ]]]
Disable waveform tracing for all future signals declared in the specified Enable/disable waveform tracing for all future signals declared in the
filename (or wildcard with '*' or '?', or all files if omitted) and range specified filename (or wildcard with '*' or '?', or all files if omitted)
of line numbers (or all lines if omitted). and range of line numbers (or all lines if omitted).
For tracing_off, cells below any module in the files/ranges specified will
also not be traced.
=back =back
@@ -2075,45 +2162,52 @@ per the C standard (it's unspecified in Verilog).
=item `coverage_block_off =item `coverage_block_off
Specifies the entire begin/end block should be ignored for coverage analysis. Specifies the entire begin/end block should be ignored for coverage
analysis. Must be inside a basic block, e.g. within a begin/end pair.
Same as /* verilator coverage_block_off */. Same as /* verilator coverage_block_off */.
=item `systemc_header =item `systemc_header
Take remaining text up to the next `verilog or `systemc_... mode switch and Take remaining text up to the next `verilog or `systemc_... mode switch and
place it verbatim into the output .h file's header. Despite the name of this place it verbatim into the output .h file's header. Must be placed as a
macro, this also works in pure C++ code. module item, e.g. directly inside a module/endmodule pair. Despite the name
of this macro, this also works in pure C++ code.
=item `systemc_ctor =item `systemc_ctor
Take remaining text up to the next `verilog or `systemc_... mode switch and Take remaining text up to the next `verilog or `systemc_... mode switch and
place it verbatim into the C++ class constructor. Despite the name of this place it verbatim into the C++ class constructor. Must be placed as a
macro, this also works in pure C++ code. module item, e.g. directly inside a module/endmodule pair. Despite the name
of this macro, this also works in pure C++ code.
=item `systemc_dtor =item `systemc_dtor
Take remaining text up to the next `verilog or `systemc_... mode switch and Take remaining text up to the next `verilog or `systemc_... mode switch and
place it verbatim into the C++ class destructor. Despite the name of this place it verbatim into the C++ class destructor. Must be placed as a
macro, this also works in pure C++ code. module item, e.g. directly inside a module/endmodule pair. Despite the name
of this macro, this also works in pure C++ code.
=item `systemc_interface =item `systemc_interface
Take remaining text up to the next `verilog or `systemc_... mode switch and Take remaining text up to the next `verilog or `systemc_... mode switch and
place it verbatim into the C++ class interface. Despite the name of this place it verbatim into the C++ class interface. Must be placed as a module
macro, this also works in pure C++ code. item, e.g. directly inside a module/endmodule pair. Despite the name of
this macro, this also works in pure C++ code.
=item `systemc_imp_header =item `systemc_imp_header
Take remaining text up to the next `verilog or `systemc_... mode switch and Take remaining text up to the next `verilog or `systemc_... mode switch and
place it verbatim into the header of all files for this C++ class place it verbatim into the header of all files for this C++ class
implementation. Despite the name of this macro, this also works in pure implementation. Must be placed as a module item, e.g. directly inside a
C++ code. module/endmodule pair. Despite the name of this macro, this also works in
pure C++ code.
=item `systemc_implementation =item `systemc_implementation
Take remaining text up to the next `verilog or `systemc_... mode switch and Take remaining text up to the next `verilog or `systemc_... mode switch and
place it verbatim into a single file of the C++ class implementation. place it verbatim into a single file of the C++ class implementation. Must
Despite the name of this macro, this also works in pure C++ code. be placed as a module item, e.g. directly inside a module/endmodule
pair. Despite the name of this macro, this also works in pure C++ code.
If you will be reading or writing any Verilog variables in the C++ If you will be reading or writing any Verilog variables in the C++
functions, the Verilog signals must be declared with /*verilator public*/. functions, the Verilog signals must be declared with /*verilator public*/.
@@ -2396,7 +2490,7 @@ simulates as Synopsys's Design Compiler would; namely a block of the form:
This will recompute y when there is even a potential for change in x or a This will recompute y when there is even a potential for change in x or a
change in z, that is when the flops computing x or z evaluate (which is change in z, that is when the flops computing x or z evaluate (which is
what Design Compiler will synthesize.) A compliant simulator would only what Design Compiler will synthesize.) A compliant simulator would only
calculate y if x changes. Use verilog-mode's /*AS*/ or Verilog 2001's calculate y if x changes. Use Verilog-Mode's /*AS*/ or Verilog 2001's
always @* to reduce missing activity items. Avoid putting $displays in always @* to reduce missing activity items. Avoid putting $displays in
combo blocks, as they may print multiple times when not desired, even on combo blocks, as they may print multiple times when not desired, even on
compliant simulators as event ordering is not specified. compliant simulators as event ordering is not specified.
@@ -2479,7 +2573,7 @@ variables are initialized to a random value.
Event driven simulators will generally trigger an edge on a transition from X Event driven simulators will generally trigger an edge on a transition from X
to 1 (C<posedge>) or X to 0 (C<negedge>). However, by default, since clocks to 1 (C<posedge>) or X to 0 (C<negedge>). However, by default, since clocks
are initialized to zero, Verilator will not trigger an initial negedge. Some are initialized to zero, Verilator will not trigger an initial negedge. Some
code (particulary for reset) may rely on X->0 triggering an edge. Verilator code (particularly for reset) may rely on X->0 triggering an edge. Verilator
provides a switch (see --x-initial-edge) to enable this behavior. Comparing provides a switch (see --x-initial-edge) to enable this behavior. Comparing
runs with and without this switch will find such problems. runs with and without this switch will find such problems.
@@ -2532,7 +2626,7 @@ clock_enable*/ attribute.
=head2 Ranges must be big-bit-endian =head2 Ranges must be big-bit-endian
Bit ranges must be numbered with the MSB being numbered greater or the same Bit ranges must be numbered with the MSB being numbered greater or the same
as the LSB. Little-bit-endian busses [0:15] are not supported as they as the LSB. Little-bit-endian buses [0:15] are not supported as they
aren't easily made compatible with C++. aren't easily made compatible with C++.
=head2 Gate Primitives =head2 Gate Primitives
@@ -2731,7 +2825,7 @@ when displaying all times, model wide.
=head1 ERRORS AND WARNINGS =head1 ERRORS AND WARNINGS
Warnings may be disabled in two ways. First, when the warning is Warnings may be disabled in three ways. First, when the warning is
printed it will include a warning code. Simply surround the offending printed it will include a warning code. Simply surround the offending
line with a warn_off/warn_on pair: line with a warn_off/warn_on pair:
@@ -2739,6 +2833,10 @@ line with a warn_off/warn_on pair:
if (`DEF_THAT_IS_EQ_ZERO <= 3) $stop; if (`DEF_THAT_IS_EQ_ZERO <= 3) $stop;
// verilator lint_on UNSIGNED // verilator lint_on UNSIGNED
Second, warnings may be disabled using a configuration file with a lint_off
command. This is useful when a script is suppressing warnings and the
Verilog source should not be changed.
Warnings may also be globally disabled by invoking Verilator with the Warnings may also be globally disabled by invoking Verilator with the
C<-Wno-I<warning>> switch. This should be avoided, as it removes all C<-Wno-I<warning>> switch. This should be avoided, as it removes all
checking across the designs, and prevents other users from compiling your checking across the designs, and prevents other users from compiling your
@@ -3305,6 +3403,10 @@ with "unused" in the name, or put the appropriate lint_off around the wire.
Having unused signals in one place makes it easy to find what is unused, Having unused signals in one place makes it easy to find what is unused,
and reduces the number of lint_off pragmas, reducing bugs. and reduces the number of lint_off pragmas, reducing bugs.
=item USERINFO, USERWARN, USERERROR, USERFATAL
A SystemVerilog elaboration-time assertion print was executed.
=item VARHIDDEN =item VARHIDDEN
Warns that a task, function, or begin/end block is declaring a variable by Warns that a task, function, or begin/end block is declaring a variable by
@@ -3563,7 +3665,10 @@ First, run verilator with the --coverage option. If you're using your own
makefile, compile the model with the GCC flag -DVM_COVERAGE (if using makefile, compile the model with the GCC flag -DVM_COVERAGE (if using
Verilator's, it will do this for you.) Verilator's, it will do this for you.)
Run your tests in different directories. Each test will create a At the end of your test, call VerilatedCov::write passing the name of the
coverage data file (typically "logs/coverage.dat").
Run each of your tests in different directories. Each test will create a
logs/coverage.pl file. logs/coverage.pl file.
After running all of your tests, verilator_coverage is executed. After running all of your tests, verilator_coverage is executed.
@@ -3873,7 +3978,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-2015 by Wilson Snyder. Verilator is free software; you can Copyright 2003-2016 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.
+2 -2
View File
@@ -3,7 +3,7 @@ eval 'exec perl -wS $0 ${1+"$@"}'
if 0; if 0;
###################################################################### ######################################################################
# #
# Copyright 2003-2015 by Wilson Snyder. This program is free software; you # Copyright 2003-2016 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.
@@ -271,7 +271,7 @@ Specifies a module search directory.
The latest version is available from L<http://www.veripool.org/>. The latest version is available from L<http://www.veripool.org/>.
Copyright 2003-2015 by Wilson Snyder. Verilator is free software; you can Copyright 2003-2016 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.
+1 -1
View File
@@ -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-2015 by Wilson Snyder. This package is free software; you can Copyright 2005-2016 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.
+1 -1
View File
@@ -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-2015 by Wilson Snyder. This package is free software; you can # Copyright 2003-2016 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.
###################################################################### ######################################################################
+1 -1
View File
@@ -222,7 +222,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-2015 by Wilson Snyder. Verilator is free software; you can Copyright 2007-2016 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.
+6 -2
View File
@@ -1,12 +1,14 @@
# DESCRIPTION: Process this file with autoconf to produce a configure script. # DESCRIPTION: Process this file with autoconf to produce a configure script.
# #
# Copyright 2003-2015 by Wilson Snyder. Verilator is free software; you can # Copyright 2003-2016 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.874 2015-06-06]) AC_INIT([Verilator],[3.886 2016-07-30])
# When releasing, also update header of Changes file
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 verilator.pc) AC_CONFIG_FILES(Makefile src/Makefile src/Makefile_obj include/verilated.mk include/verilated_config.h verilator.pc)
@@ -128,7 +130,9 @@ AC_DEFUN([_MY_CXX_CHECK_OPT],
# Flags for compiling Verilator internals including parser # Flags for compiling Verilator internals including parser
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-unused-parameter) _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-unused-parameter)
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-char-subscripts) _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-char-subscripts)
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Wno-undefined-bool-conversion)
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Qunused-arguments) _MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-Qunused-arguments)
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_SRC,-fno-delete-null-pointer-checks)
AC_SUBST(CFG_CXXFLAGS_SRC) AC_SUBST(CFG_CXXFLAGS_SRC)
# Flags for compiling Verilator parser # Flags for compiling Verilator parser
+135 -82
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -374,7 +374,7 @@ void _vl_vsformat(string& output, const char* formatp, va_list ap) {
} else { } else {
lwp = va_arg(ap,WDataInP); lwp = va_arg(ap,WDataInP);
ld = lwp[0]; ld = lwp[0];
if (fmt == 'u' || fmt == 'd') fmt = 'x'; // Not supported, but show something if (fmt == 'd' || fmt == '#') fmt = 'x'; // Not supported, but show something
} }
int lsb=lbits-1; int lsb=lbits-1;
if (widthSet && width==0) while (lsb && !VL_BITISSET_W(lwp,lsb)) lsb--; if (widthSet && width==0) while (lsb && !VL_BITISSET_W(lwp,lsb)) lsb--;
@@ -404,7 +404,7 @@ void _vl_vsformat(string& output, const char* formatp, va_list ap) {
output += tmp; output += tmp;
break; break;
} }
case 'u': { // Unsigned decimal case '#': { // Unsigned decimal
int digits=sprintf(tmp,"%" VL_PRI64 "u",ld); int digits=sprintf(tmp,"%" VL_PRI64 "u",ld);
int needmore = width-digits; int needmore = width-digits;
if (needmore>0) { if (needmore>0) {
@@ -438,6 +438,7 @@ void _vl_vsformat(string& output, const char* formatp, va_list ap) {
output += ((lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 1) + '0'; output += ((lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 1) + '0';
} }
break; break;
break;
case 'o': case 'o':
for (; lsb>=0; lsb--) { for (; lsb>=0; lsb--) {
lsb = (lsb / 3) * 3; // Next digit lsb = (lsb / 3) * 3; // Next digit
@@ -450,6 +451,28 @@ void _vl_vsformat(string& output, const char* formatp, va_list ap) {
+ ((VL_BITISSETLIMIT_W(lwp, lbits, lsb+2)) ? 4 : 0)); + ((VL_BITISSETLIMIT_W(lwp, lbits, lsb+2)) ? 4 : 0));
} }
break; break;
case 'u': // Packed 2-state
output.reserve(output.size() + 4*VL_WORDS_I(lbits));
for (int i=0; i<VL_WORDS_I(lbits); i++) {
output += (char)((lwp[i] >> 0) & 0xff);
output += (char)((lwp[i] >> 8) & 0xff);
output += (char)((lwp[i] >> 16) & 0xff);
output += (char)((lwp[i] >> 24) & 0xff);
}
case 'z': // Packed 4-state
output.reserve(output.size() + 8*VL_WORDS_I(lbits));
for (int i=0; i<VL_WORDS_I(lbits); i++) {
output += (char)((lwp[i] >> 0) & 0xff);
output += (char)((lwp[i] >> 8) & 0xff);
output += (char)((lwp[i] >> 16) & 0xff);
output += (char)((lwp[i] >> 24) & 0xff);
output += "\0\0\0\0"; // No tristate
}
case 'v': // Strength; assume always strong
for (lsb=lbits-1; lsb>=0; lsb--) {
if ((lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 1) output += "St1 ";
else output += "St0 ";
}
case 'x': case 'x':
for (; lsb>=0; lsb--) { for (; lsb>=0; lsb--) {
lsb = (lsb / 4) * 4; // Next digit lsb = (lsb / 4) * 4; // Next digit
@@ -627,13 +650,14 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf
_vl_vsss_skipspace(fp,floc,fromp,fstr); _vl_vsss_skipspace(fp,floc,fromp,fstr);
_vl_vsss_read(fp,floc,fromp,fstr, tmp, "+-.0123456789eE"); _vl_vsss_read(fp,floc,fromp,fstr, tmp, "+-.0123456789eE");
if (!tmp[0]) goto done; if (!tmp[0]) goto done;
// cppcheck-suppress unusedStructMember // It's used
union { double r; vlsint64_t ld; } u; union { double r; vlsint64_t ld; } u;
u.r = strtod(tmp, NULL); u.r = strtod(tmp, NULL);
VL_SET_WQ(owp,u.ld); VL_SET_WQ(owp,u.ld);
break; break;
} }
case 't': // FALLTHRU // Time case 't': // FALLTHRU // Time
case 'u': { // Unsigned decimal case '#': { // Unsigned decimal
_vl_vsss_skipspace(fp,floc,fromp,fstr); _vl_vsss_skipspace(fp,floc,fromp,fstr);
_vl_vsss_read(fp,floc,fromp,fstr, tmp, "0123456789+-xXzZ?_"); _vl_vsss_read(fp,floc,fromp,fstr, tmp, "0123456789+-xXzZ?_");
if (!tmp[0]) goto done; if (!tmp[0]) goto done;
@@ -708,8 +732,8 @@ void _VL_VINT_TO_STRING(int obits, char* destoutp, WDataInP sourcep) {
start = false; // Drop leading 0s start = false; // Drop leading 0s
} }
} }
*destp++ = '\0'; // Terminate *destp = '\0'; // Terminate
while (isspace(*(destp-1)) && destp>destoutp) *--destp = '\0'; // Drop trailing spaces if (!start) while (isspace(*(destp-1)) && destp>destoutp) *--destp = '\0'; // Drop trailing spaces
} }
void _VL_STRING_TO_VINT(int obits, void* destp, int srclen, const char* srcp) { void _VL_STRING_TO_VINT(int obits, void* destp, int srclen, const char* srcp) {
@@ -750,6 +774,11 @@ IData VL_FGETS_IXI(int obits, void* destp, IData fpi) {
return got; return got;
} }
IData VL_FOPEN_NI(const string& filename, IData mode) {
char modez[5];
_VL_VINT_TO_STRING(VL_WORDSIZE, modez, &mode);
return VL_FOPEN_S(filename.c_str(), modez);
}
IData VL_FOPEN_QI(QData filename, IData mode) { IData VL_FOPEN_QI(QData filename, IData mode) {
IData fnw[2]; VL_SET_WQ(fnw, filename); IData fnw[2]; VL_SET_WQ(fnw, filename);
return VL_FOPEN_WI(2, fnw, mode); return VL_FOPEN_WI(2, fnw, mode);
@@ -927,11 +956,18 @@ void VL_READMEM_W(bool hex, int width, int depth, int array_lsb, int fnwords,
WDataInP ofilenamep, void* memp, IData start, IData end) { WDataInP ofilenamep, void* memp, IData start, IData end) {
char ofilenamez[VL_TO_STRING_MAX_WORDS*VL_WORDSIZE+1]; char ofilenamez[VL_TO_STRING_MAX_WORDS*VL_WORDSIZE+1];
_VL_VINT_TO_STRING(fnwords*VL_WORDSIZE, ofilenamez, ofilenamep); _VL_VINT_TO_STRING(fnwords*VL_WORDSIZE, ofilenamez, ofilenamep);
FILE* fp = fopen(ofilenamez, "r"); string ofilenames(ofilenamez);
return VL_READMEM_N(hex,width,depth,array_lsb,fnwords,ofilenames,memp,start,end);
}
void VL_READMEM_N(bool hex, int width, int depth, int array_lsb, int fnwords,
const string& ofilenamep, void* memp, IData start, IData end) {
if (fnwords) {}
FILE* fp = fopen(ofilenamep.c_str(), "r");
if (VL_UNLIKELY(!fp)) { if (VL_UNLIKELY(!fp)) {
// We don't report the Verilog source filename as it slow to have to pass it down // We don't report the Verilog source filename as it slow to have to pass it down
vl_fatal (ofilenamez, 0, "", "$readmem file not found"); vl_fatal (ofilenamep.c_str(), 0, "", "$readmem file not found");
return; return;
} }
// Prep for reading // Prep for reading
IData addr = start; IData addr = start;
@@ -946,81 +982,81 @@ void VL_READMEM_W(bool hex, int width, int depth, int array_lsb, int fnwords,
// We process a character at a time, as then we don't need to deal // We process a character at a time, as then we don't need to deal
// with changing buffer sizes dynamically, etc. // with changing buffer sizes dynamically, etc.
while (1) { while (1) {
int c = fgetc(fp); int c = fgetc(fp);
if (VL_UNLIKELY(c==EOF)) break; if (VL_UNLIKELY(c==EOF)) break;
//printf("%d: Got '%c' Addr%x IN%d IgE%d IgC%d ninc%d\n", linenum, c, addr, innum, ignore_to_eol, ignore_to_cmt, needinc); //printf("%d: Got '%c' Addr%x IN%d IgE%d IgC%d ninc%d\n", linenum, c, addr, innum, ignore_to_eol, ignore_to_cmt, needinc);
if (c=='\n') { linenum++; ignore_to_eol=false; if (innum) reading_addr=false; innum=false; } if (c=='\n') { linenum++; ignore_to_eol=false; if (innum) reading_addr=false; innum=false; }
else if (c=='\t' || c==' ' || c=='\r' || c=='\f') { if (innum) reading_addr=false; innum=false; } else if (c=='\t' || c==' ' || c=='\r' || c=='\f') { if (innum) reading_addr=false; innum=false; }
// Skip // comments and detect /* comments // Skip // comments and detect /* comments
else if (ignore_to_cmt && lastc=='*' && c=='/') { else if (ignore_to_cmt && lastc=='*' && c=='/') {
ignore_to_cmt = false; if (innum) reading_addr=false; innum=false; ignore_to_cmt = false; if (innum) reading_addr=false; innum=false;
} else if (!ignore_to_eol && !ignore_to_cmt) { } else if (!ignore_to_eol && !ignore_to_cmt) {
if (lastc=='/' && c=='*') { ignore_to_cmt = true; } if (lastc=='/' && c=='*') { ignore_to_cmt = true; }
else if (lastc=='/' && c=='/') { ignore_to_eol = true; } else if (lastc=='/' && c=='/') { ignore_to_eol = true; }
else if (c=='/') {} // Part of /* or // else if (c=='/') {} // Part of /* or //
else if (c=='_') {} else if (c=='_') {}
else if (c=='@') { reading_addr = true; innum=false; needinc=false; } else if (c=='@') { reading_addr = true; innum=false; needinc=false; }
// Check for hex or binary digits as file format requests // Check for hex or binary digits as file format requests
else if (isxdigit(c)) { else if (isxdigit(c)) {
c = tolower(c); c = tolower(c);
int value = (c >= 'a' ? (c-'a'+10) : (c-'0')); int value = (c >= 'a' ? (c-'a'+10) : (c-'0'));
if (!innum) { // Prep for next number if (!innum) { // Prep for next number
if (needinc) { addr++; needinc=false; } if (needinc) { addr++; needinc=false; }
} }
if (reading_addr) { if (reading_addr) {
// Decode @ addresses // Decode @ addresses
if (!innum) addr=0; if (!innum) addr=0;
addr = (addr<<4) + value; addr = (addr<<4) + value;
} else { } else {
needinc = true; needinc = true;
//printf(" Value width=%d @%x = %c\n", width, addr, c); //printf(" Value width=%d @%x = %c\n", width, addr, c);
if (VL_UNLIKELY(addr >= (IData)(depth+array_lsb) || addr < (IData)(array_lsb))) { if (VL_UNLIKELY(addr >= (IData)(depth+array_lsb) || addr < (IData)(array_lsb))) {
vl_fatal (ofilenamez, linenum, "", "$readmem file address beyond bounds of array"); vl_fatal (ofilenamep.c_str(), linenum, "", "$readmem file address beyond bounds of array");
} else { } else {
int entry = addr - array_lsb; int entry = addr - array_lsb;
QData shift = hex ? VL_ULL(4) : VL_ULL(1); QData shift = hex ? VL_ULL(4) : VL_ULL(1);
// Shift value in // Shift value in
if (width<=8) { if (width<=8) {
CData* datap = &((CData*)(memp))[entry]; CData* datap = &((CData*)(memp))[entry];
if (!innum) { *datap = 0; } if (!innum) { *datap = 0; }
*datap = ((*datap << shift) + value) & VL_MASK_I(width); *datap = ((*datap << shift) + value) & VL_MASK_I(width);
} else if (width<=16) { } else if (width<=16) {
SData* datap = &((SData*)(memp))[entry]; SData* datap = &((SData*)(memp))[entry];
if (!innum) { *datap = 0; } if (!innum) { *datap = 0; }
*datap = ((*datap << shift) + value) & VL_MASK_I(width); *datap = ((*datap << shift) + value) & VL_MASK_I(width);
} else if (width<=VL_WORDSIZE) { } else if (width<=VL_WORDSIZE) {
IData* datap = &((IData*)(memp))[entry]; IData* datap = &((IData*)(memp))[entry];
if (!innum) { *datap = 0; } if (!innum) { *datap = 0; }
*datap = ((*datap << shift) + value) & VL_MASK_I(width); *datap = ((*datap << shift) + value) & VL_MASK_I(width);
} else if (width<=VL_QUADSIZE) { } else if (width<=VL_QUADSIZE) {
QData* datap = &((QData*)(memp))[entry]; QData* datap = &((QData*)(memp))[entry];
if (!innum) { *datap = 0; } if (!innum) { *datap = 0; }
*datap = ((*datap << (QData)(shift)) + (QData)(value)) & VL_MASK_Q(width); *datap = ((*datap << (QData)(shift)) + (QData)(value)) & VL_MASK_Q(width);
} else { } else {
WDataOutP datap = &((WDataOutP)(memp))[ entry*VL_WORDS_I(width) ]; WDataOutP datap = &((WDataOutP)(memp))[ entry*VL_WORDS_I(width) ];
if (!innum) { VL_ZERO_RESET_W(width, datap); } if (!innum) { VL_ZERO_RESET_W(width, datap); }
_VL_SHIFTL_INPLACE_W(width, datap, (IData)shift); _VL_SHIFTL_INPLACE_W(width, datap, (IData)shift);
datap[0] |= value; datap[0] |= value;
} }
if (VL_UNLIKELY(value>=(1<<shift))) { if (VL_UNLIKELY(value>=(1<<shift))) {
vl_fatal (ofilenamez, linenum, "", "$readmemb (binary) file contains hex characters"); vl_fatal (ofilenamep.c_str(), linenum, "", "$readmemb (binary) file contains hex characters");
} }
} }
} }
innum = true; innum = true;
} }
else { else {
vl_fatal (ofilenamez, linenum, "", "$readmem file syntax error"); vl_fatal (ofilenamep.c_str(), linenum, "", "$readmem file syntax error");
} }
} }
lastc = c; lastc = c;
} }
if (needinc) { addr++; needinc=false; } if (needinc) { addr++; needinc=false; }
// Final checks // Final checks
fclose(fp); fclose(fp);
if (VL_UNLIKELY(end != VL_UL(0xffffffff) && addr != (end+1))) { if (VL_UNLIKELY(end != VL_UL(0xffffffff) && addr != (end+1))) {
vl_fatal (ofilenamez, linenum, "", "$readmem file ended before specified ending-address"); vl_fatal (ofilenamep.c_str(), linenum, "", "$readmem file ended before specified ending-address");
} }
} }
@@ -1041,6 +1077,14 @@ IData VL_TESTPLUSARGS_I(const char* formatp) {
else return 1; else return 1;
} }
IData VL_VALUEPLUSARGS_IN(int, const char* prefixp, char, string& ldr) {
const string& match = VerilatedImp::argPlusMatch(prefixp);
const char* dp = match.c_str() + 1 /*leading + */ + strlen(prefixp);
if (match == "") return 0;
ldr = string(dp);
return 1;
}
IData VL_VALUEPLUSARGS_IW(int rbits, const char* prefixp, char fmt, WDataOutP rwp) { IData VL_VALUEPLUSARGS_IW(int rbits, const char* prefixp, char fmt, WDataOutP rwp) {
const string& match = VerilatedImp::argPlusMatch(prefixp); const string& match = VerilatedImp::argPlusMatch(prefixp);
const char* dp = match.c_str() + 1 /*leading + */ + strlen(prefixp); const char* dp = match.c_str() + 1 /*leading + */ + strlen(prefixp);
@@ -1146,7 +1190,12 @@ void Verilated::commandArgs(int argc, const char** argv) {
} }
const char* Verilated::commandArgsPlusMatch(const char* prefixp) { const char* Verilated::commandArgsPlusMatch(const char* prefixp) {
return VerilatedImp::argPlusMatch(prefixp).c_str(); const string& match = VerilatedImp::argPlusMatch(prefixp);
static VL_THREAD char outstr[VL_VALUE_STRING_MAX_WIDTH];
if (match == "") return "";
strncpy(outstr, match.c_str(), VL_VALUE_STRING_MAX_WIDTH);
outstr[VL_VALUE_STRING_MAX_WIDTH-1] = '\0';
return outstr;
} }
void Verilated::internalsDump() { void Verilated::internalsDump() {
@@ -1165,6 +1214,10 @@ int Verilated::exportFuncNum(const char* namep) {
return VerilatedImp::exportFind(namep); return VerilatedImp::exportFind(namep);
} }
const VerilatedScopeNameMap* Verilated::scopeNameMap() {
return VerilatedImp::scopeNameMap();
}
//=========================================================================== //===========================================================================
// VerilatedModule:: Methods // VerilatedModule:: Methods
@@ -1173,7 +1226,7 @@ VerilatedModule::VerilatedModule(const char* namep)
} }
VerilatedModule::~VerilatedModule() { VerilatedModule::~VerilatedModule() {
if (m_namep) free((void*)m_namep); m_namep=NULL; if (m_namep) { free((void*)m_namep); m_namep=NULL; }
} }
//====================================================================== //======================================================================
@@ -1287,7 +1340,7 @@ VerilatedVar* VerilatedScope::varFind(const char* namep) const {
return NULL; return NULL;
} }
void* VerilatedScope::exportFindNullError(int funcnum) const { void* VerilatedScope::exportFindNullError(int funcnum) {
// Slowpath - Called only when find has failed // Slowpath - Called only when find has failed
string msg = (string("Testbench C called '") string msg = (string("Testbench C called '")
+VerilatedImp::exportName(funcnum) +VerilatedImp::exportName(funcnum)
+16 -10
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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,7 @@
#include <cstring> #include <cstring>
#include <cmath> #include <cmath>
// <iostream> avoided to reduce compile time // <iostream> avoided to reduce compile time
// <map> avoided and instead in verilated_heavy.h to reduce compile time
// <string> avoided and instead in verilated_heavy.h to reduce compile time // <string> avoided and instead in verilated_heavy.h to reduce compile time
using namespace std; using namespace std;
@@ -68,6 +69,7 @@ typedef void (*VerilatedVoidCb)(void);
class SpTraceVcd; class SpTraceVcd;
class SpTraceVcdCFile; class SpTraceVcdCFile;
class VerilatedScopeNameMap;
class VerilatedVar; class VerilatedVar;
class VerilatedVarNameMap; class VerilatedVarNameMap;
class VerilatedVcd; class VerilatedVcd;
@@ -102,9 +104,9 @@ class VerilatedModule {
private: private:
const char* m_namep; ///< Module name const char* m_namep; ///< Module name
VerilatedModule(); ///< N/A, always use named constructor below VerilatedModule(); ///< N/A, always use named constructor below
VerilatedModule(const VerilatedModule& ); ///< N/A, no copying modules VerilatedModule(const VerilatedModule& ); ///< N/A, no copy constructor
public: public:
VerilatedModule(const char* namep); ///< Create module with given hierarchy name explicit VerilatedModule(const char* namep); ///< Create module with given hierarchy name
~VerilatedModule(); ~VerilatedModule();
const char* name() const { return m_namep; } ///< Return name of module const char* name() const { return m_namep; } ///< Return name of module
}; };
@@ -199,16 +201,16 @@ public: // But internals only - called from VerilatedModule's
inline VerilatedSyms* symsp() const { return m_symsp; } inline VerilatedSyms* symsp() const { return m_symsp; }
VerilatedVar* varFind(const char* namep) const; VerilatedVar* varFind(const char* namep) const;
VerilatedVarNameMap* varsp() const { return m_varsp; } VerilatedVarNameMap* varsp() const { return m_varsp; }
void* exportFindError(int funcnum) const;
void* exportFindNullError(int funcnum) const;
void scopeDump() const; void scopeDump() const;
inline void* exportFind(int funcnum) const { void* exportFindError(int funcnum) const;
if (VL_UNLIKELY(!this)) return exportFindNullError(funcnum); static void* exportFindNullError(int funcnum);
if (VL_LIKELY(funcnum < m_funcnumMax)) { static inline void* exportFind(const VerilatedScope* scopep, int funcnum) {
if (VL_UNLIKELY(!scopep)) return exportFindNullError(funcnum);
if (VL_LIKELY(funcnum < scopep->m_funcnumMax)) {
// m_callbacksp must be declared, as Max'es are > 0 // m_callbacksp must be declared, as Max'es are > 0
return m_callbacksp[funcnum]; return scopep->m_callbacksp[funcnum];
} else { } else {
return exportFindError(funcnum); return scopep->exportFindError(funcnum);
} }
} }
}; };
@@ -286,7 +288,9 @@ public:
/// Record command line arguments, for retrieval by $test$plusargs/$value$plusargs /// Record command line arguments, for retrieval by $test$plusargs/$value$plusargs
static void commandArgs(int argc, const char** argv); static void commandArgs(int argc, const char** argv);
static void commandArgs(int argc, char** argv) { commandArgs(argc,(const char**)argv); } static void commandArgs(int argc, char** argv) { commandArgs(argc,(const char**)argv); }
static void commandArgsAdd(int argc, const char** argv);
static CommandArgValues* getCommandArgs() {return &s_args;} static CommandArgValues* getCommandArgs() {return &s_args;}
/// Match plusargs with a given prefix. Returns static char* valid only for a single call
static const char* commandArgsPlusMatch(const char* prefixp); static const char* commandArgsPlusMatch(const char* prefixp);
/// Produce name & version for (at least) VPI /// Produce name & version for (at least) VPI
@@ -308,6 +312,7 @@ public:
static const char* catName(const char* n1, const char* n2); // Returns new'ed data static const char* catName(const char* n1, const char* n2); // Returns new'ed data
// Internal: Find scope // Internal: Find scope
static const VerilatedScope* scopeFind(const char* namep); static const VerilatedScope* scopeFind(const char* namep);
static const VerilatedScopeNameMap* scopeNameMap();
// Internal: Get and set DPI context // Internal: Get and set DPI context
static const VerilatedScope* dpiScope() { return t_dpiScopep; } static const VerilatedScope* dpiScope() { return t_dpiScopep; }
static void dpiScope(const VerilatedScope* scopep) { t_dpiScopep=scopep; } static void dpiScope(const VerilatedScope* scopep) { t_dpiScopep=scopep; }
@@ -357,6 +362,7 @@ extern IData VL_FOPEN_WI(int fnwords, WDataInP ofilename, IData mode);
extern IData VL_FOPEN_QI(QData ofilename, IData mode); extern IData VL_FOPEN_QI(QData ofilename, IData mode);
inline IData VL_FOPEN_II(IData ofilename, IData mode) { return VL_FOPEN_QI(ofilename,mode); } inline IData VL_FOPEN_II(IData ofilename, IData mode) { return VL_FOPEN_QI(ofilename,mode); }
extern void VL_FCLOSE_I(IData fdi); extern void VL_FCLOSE_I(IData fdi);
extern void VL_READMEM_W(bool hex, int width, int depth, int array_lsb, int fnwords, extern void VL_READMEM_W(bool hex, int width, int depth, int array_lsb, int fnwords,
+1 -5
View File
@@ -2,7 +2,7 @@
###################################################################### ######################################################################
# DESCRIPTION: Makefile commands for all verilated target files # DESCRIPTION: Makefile commands for all verilated target files
# #
# Copyright 2003-2015 by Wilson Snyder. Verilator is free software; you can # Copyright 2003-2016 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.
###################################################################### ######################################################################
@@ -120,10 +120,6 @@ ifeq ($(VM_SP),1)
$(SP_PREPROC) -M sp_preproc.d --tree $(VM_PREFIX).sp_tree \ $(SP_PREPROC) -M sp_preproc.d --tree $(VM_PREFIX).sp_tree \
--preproc $(VK_CLASSES_SP) --preproc $(VK_CLASSES_SP)
else else
ifeq ($(VM_COVERAGE),1)
CPPFLAGS += -I$(SYSTEMPERL_INCLUDE)
VPATH += $(SYSTEMPERL_INCLUDE)
endif
preproc: preproc:
endif endif
+1 -1
View File
@@ -4,7 +4,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+7 -4
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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.
// //
@@ -75,6 +75,7 @@ public:
virtual vluint64_t count() const { return *m_countp; } virtual vluint64_t count() const { return *m_countp; }
virtual void zero() const { *m_countp = 0; } virtual void zero() const { *m_countp = 0; }
// CONSTRUCTORS // CONSTRUCTORS
// cppcheck-suppress noExplicitConstructor
VerilatedCoverItemSpec(T* countp) : m_countp(countp) { zero(); } VerilatedCoverItemSpec(T* countp) : m_countp(countp) { zero(); }
virtual ~VerilatedCoverItemSpec() {} virtual ~VerilatedCoverItemSpec() {}
}; };
@@ -261,8 +262,8 @@ public:
assert(m_insertp); assert(m_insertp);
// First two key/vals are filename // First two key/vals are filename
ckeyps[0]="filename"; valps[0]=m_insertFilenamep; ckeyps[0]="filename"; valps[0]=m_insertFilenamep;
VlCovCvtToCStr linestrp (m_insertLineno); string linestr = vlCovCvtToStr(m_insertLineno);
ckeyps[1]="lineno"; valps[1]=linestrp; ckeyps[1]="lineno"; valps[1]=linestr.c_str();
// Default page if not specified // Default page if not specified
const char* fnstartp = m_insertFilenamep; const char* fnstartp = m_insertFilenamep;
while (const char* foundp = strchr(fnstartp,'/')) fnstartp=foundp+1; while (const char* foundp = strchr(fnstartp,'/')) fnstartp=foundp+1;
@@ -440,8 +441,10 @@ void VerilatedCov::_insertp (A(0),A(1),A(2),A(3),A(4),A(5),A(6),A(7),A(8),A(9),
// Backward compatibility for Verilator // Backward compatibility for Verilator
void VerilatedCov::_insertp (A(0), A(1), K(2),int val2, K(3),int val3, void VerilatedCov::_insertp (A(0), A(1), K(2),int val2, K(3),int val3,
K(4),const string& val4, A(5),A(6)) { K(4),const string& val4, A(5),A(6)) {
string val2str = vlCovCvtToStr(val2);
string val3str = vlCovCvtToStr(val3);
_insertp(C(0),C(1), _insertp(C(0),C(1),
key2,VlCovCvtToCStr(val2), key3,VlCovCvtToCStr(val3), key4, val4.c_str(), key2,val2str.c_str(), key3,val3str.c_str(), key4, val4.c_str(),
C(5),C(6),N(7),N(8),N(9), C(5),C(6),N(7),N(8),N(9),
N(10),N(11),N(12),N(13),N(14),N(15),N(16),N(17),N(18),N(19), N(10),N(11),N(12),N(13),N(14),N(15),N(16),N(17),N(18),N(19),
N(20),N(21),N(22),N(23),N(24),N(25),N(26),N(27),N(28),N(29)); N(20),N(21),N(22),N(23),N(24),N(25),N(26),N(27),N(28),N(29));
+1 -14
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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.
// //
@@ -78,19 +78,6 @@ template< class T> std::string vlCovCvtToStr (const T& t) {
ostringstream os; os<<t; return os.str(); ostringstream os; os<<t; return os.str();
} }
/// Usage: something(VlCovCvtToCStr(i))
/// Note the pointer will only be valid for as long as the object remains
/// in scope!
struct VlCovCvtToCStr {
string m_str;
// Casters
template< class T> VlCovCvtToCStr (const T& t) {
ostringstream os; os<<t; m_str=os.str();
}
~VlCovCvtToCStr() {}
operator const char* () const { return m_str.c_str(); };
};
//============================================================================= //=============================================================================
// VerilatedCov // VerilatedCov
/// Verilator coverage global class /// Verilator coverage global class
+1 -1
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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 -1
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2009-2015 by Wilson Snyder. This program is free software; you can // Copyright 2009-2016 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
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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 -1
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2010-2015 by Wilson Snyder. This program is free software; you can // Copyright 2010-2016 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.
@@ -60,8 +60,12 @@ inline string VL_REPLICATEN_NNI(int obits,int lbits,int rbits, const string& lhs
return VL_REPLICATEN_NNQ(obits,lbits,rbits,lhs,rep); return VL_REPLICATEN_NNQ(obits,lbits,rbits,lhs,rep);
} }
extern IData VL_FOPEN_NI(const string& filename, IData mode);
extern void VL_READMEM_N(bool hex, int width, int depth, int array_lsb, int fnwords,
const string& ofilename, void* memp, IData start, IData end);
extern IData VL_SSCANF_INX(int lbits, const string& ld, const char* formatp, ...); extern IData VL_SSCANF_INX(int lbits, const string& ld, const char* formatp, ...);
extern void VL_SFORMAT_X(int obits_ignored, string &output, const char* formatp, ...); 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, ...);
extern IData VL_VALUEPLUSARGS_IN(int rbits, const char* prefixp, char fmt, string& ldr);
#endif // Guard #endif // Guard
+14 -8
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2009-2015 by Wilson Snyder. This program is free software; you can // Copyright 2009-2016 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.
@@ -49,7 +49,6 @@ class VerilatedImp {
// TYPES // TYPES
typedef vector<string> ArgVec; typedef vector<string> ArgVec;
typedef map<pair<const void*,void*>,void*> UserMap; typedef map<pair<const void*,void*>,void*> UserMap;
typedef map<const char*, const VerilatedScope*, VerilatedCStrCmp> ScopeNameMap;
typedef map<const char*, int, VerilatedCStrCmp> ExportNameMap; typedef map<const char*, int, VerilatedCStrCmp> ExportNameMap;
// MEMBERS // MEMBERS
@@ -60,7 +59,7 @@ class VerilatedImp {
ArgVec m_argVec; ///< Argument list (NOT save-restored, may want different results) ArgVec m_argVec; ///< Argument list (NOT save-restored, may want different results)
bool m_argVecLoaded; ///< Ever loaded argument list bool m_argVecLoaded; ///< Ever loaded argument list
UserMap m_userMap; ///< Map of <(scope,userkey), userData> UserMap m_userMap; ///< Map of <(scope,userkey), userData>
ScopeNameMap m_nameMap; ///< Map of <scope_name, scope pointer> VerilatedScopeNameMap m_nameMap; ///< Map of <scope_name, scope pointer>
// Slow - somewhat static: // Slow - somewhat static:
ExportNameMap m_exportMap; ///< Map of <export_func_proto, func number> ExportNameMap m_exportMap; ///< Map of <export_func_proto, func number>
int m_exportNext; ///< Next export funcnum int m_exportNext; ///< Next export funcnum
@@ -93,7 +92,11 @@ public: // But only for verilated*.cpp
// METHODS - arguments // METHODS - arguments
static void commandArgs(int argc, const char** argv) { static void commandArgs(int argc, const char** argv) {
s_s.m_argVec.clear(); s_s.m_argVec.clear(); // Always clear
commandArgsAdd(argc, argv);
}
static void commandArgsAdd(int argc, const char** argv) {
if (!s_s.m_argVecLoaded) s_s.m_argVec.clear();
for (int i=0; i<argc; i++) s_s.m_argVec.push_back(argv[i]); for (int i=0; i<argc; i++) s_s.m_argVec.push_back(argv[i]);
s_s.m_argVecLoaded = true; // Can't just test later for empty vector, no arguments is ok s_s.m_argVecLoaded = true; // Can't just test later for empty vector, no arguments is ok
} }
@@ -154,30 +157,33 @@ public: // But only for verilated*.cpp
// METHODS - scope name // METHODS - scope name
static void scopeInsert(const VerilatedScope* scopep) { static void scopeInsert(const VerilatedScope* scopep) {
// Slow ok - called once/scope at construction // Slow ok - called once/scope at construction
ScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name()); VerilatedScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name());
if (it == s_s.m_nameMap.end()) { if (it == s_s.m_nameMap.end()) {
s_s.m_nameMap.insert(it, make_pair(scopep->name(),scopep)); s_s.m_nameMap.insert(it, make_pair(scopep->name(),scopep));
} }
} }
static inline const VerilatedScope* scopeFind(const char* namep) { static inline const VerilatedScope* scopeFind(const char* namep) {
ScopeNameMap::iterator it=s_s.m_nameMap.find(namep); VerilatedScopeNameMap::iterator it=s_s.m_nameMap.find(namep);
if (VL_LIKELY(it != s_s.m_nameMap.end())) return it->second; if (VL_LIKELY(it != s_s.m_nameMap.end())) return it->second;
else return NULL; else return NULL;
} }
static void scopeErase(const VerilatedScope* scopep) { static void scopeErase(const VerilatedScope* scopep) {
// Slow ok - called once/scope at destruction // Slow ok - called once/scope at destruction
userEraseScope(scopep); userEraseScope(scopep);
ScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name()); VerilatedScopeNameMap::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 (VerilatedScopeNameMap::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();
} }
VL_PRINTF("\n"); VL_PRINTF("\n");
} }
static const VerilatedScopeNameMap* scopeNameMap() {
return &s_s.m_nameMap;
}
public: // But only for verilated*.cpp public: // But only for verilated*.cpp
// METHODS - export names // METHODS - export names
+2 -2
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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.
// //
@@ -201,7 +201,7 @@ void VerilatedRestore::fill() {
if (VL_UNLIKELY(!isOpen())) return; if (VL_UNLIKELY(!isOpen())) return;
// Move remaining characters down to start of buffer. (No memcpy, overlaps allowed) // Move remaining characters down to start of buffer. (No memcpy, overlaps allowed)
vluint8_t* rp = m_bufp; vluint8_t* rp = m_bufp;
for (vluint8_t* sp=m_cp; rp < m_endp;) *rp++ = *sp++; // Overlaps for (vluint8_t* sp=m_cp; sp < m_endp;) *rp++ = *sp++; // Overlaps
m_endp = m_bufp + (m_endp - m_cp); m_endp = m_bufp + (m_endp - m_cp);
m_cp = m_bufp; // Reset buffer m_cp = m_bufp; // Reset buffer
// Read into buffer starting at m_endp // Read into buffer starting at m_endp
+4 -2
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2012-2015 by Wilson Snyder. This program is free software; // Copyright 2012-2016 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.
// //
@@ -48,6 +48,8 @@ protected:
m_bufp = new vluint8_t [bufferSize()]; m_bufp = new vluint8_t [bufferSize()];
m_cp = m_bufp; m_cp = m_bufp;
} }
private:
VerilatedSerialBase(const VerilatedSerialBase& ); ///< N/A, no copy constructor
public: public:
// CREATORS // CREATORS
virtual ~VerilatedSerialBase() { virtual ~VerilatedSerialBase() {
@@ -223,7 +225,7 @@ inline VerilatedSerialize& operator<<(VerilatedSerialize& os, string& rhs) {
return os.write(rhs.data(), len); return os.write(rhs.data(), len);
} }
inline VerilatedDeserialize& operator>>(VerilatedDeserialize& os, string& rhs) { inline VerilatedDeserialize& operator>>(VerilatedDeserialize& os, string& rhs) {
vluint32_t len; vluint32_t len=0;
os>>len; os>>len;
rhs.resize(len); rhs.resize(len);
return os.read((void*)rhs.data(), len); return os.read((void*)rhs.data(), len);
+1 -1
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2009-2015 by Wilson Snyder. This program is free software; you can // Copyright 2009-2016 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.
+15 -11
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -32,16 +32,6 @@
#include <map> #include <map>
//======================================================================
// Types
struct VerilatedCStrCmp {
/// Ordering maps keyed by const char*'s
bool operator() (const char *a, const char *b) const {
return std::strcmp(a, b) < 0;
}
};
//=========================================================================== //===========================================================================
/// Verilator range /// Verilator range
@@ -93,6 +83,20 @@ public:
//====================================================================== //======================================================================
/// Types /// Types
struct VerilatedCStrCmp {
/// Ordering maps keyed by const char*'s
bool operator() (const char *a, const char *b) const {
return std::strcmp(a, b) < 0;
}
};
class VerilatedScopeNameMap
: public map<const char*, const VerilatedScope*, VerilatedCStrCmp> {
public:
VerilatedScopeNameMap() {}
~VerilatedScopeNameMap() {}
};
class VerilatedVarNameMap : public map<const char*, VerilatedVar, VerilatedCStrCmp> { class VerilatedVarNameMap : public map<const char*, VerilatedVar, VerilatedCStrCmp> {
public: public:
VerilatedVarNameMap() {} VerilatedVarNameMap() {}
+2 -2
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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.
// //
@@ -378,7 +378,7 @@ string VerilatedVcd::doubleToTimescale (double value) {
else if (value>=1e-12) { suffixp="ps"; value *= 1e12; } else if (value>=1e-12) { suffixp="ps"; value *= 1e12; }
else if (value>=1e-15) { suffixp="fs"; value *= 1e15; } else if (value>=1e-15) { suffixp="fs"; value *= 1e15; }
else if (value>=1e-18) { suffixp="as"; value *= 1e18; } else if (value>=1e-18) { suffixp="as"; value *= 1e18; }
char valuestr[100]; sprintf(valuestr,"%d%s",(int)(value), suffixp); char valuestr[100]; sprintf(valuestr,"%3.0f%s", value, suffixp);
return valuestr; // Gets converted to string, so no ref to stack return valuestr; // Gets converted to string, so no ref to stack
} }
+5 -3
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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.
// //
@@ -144,13 +144,15 @@ private:
return out + ((char)((code)%94+33)); return out + ((char)((code)%94+33));
} }
VerilatedVcd(const VerilatedVcd& ); ///< N/A, no copy constructor
protected: protected:
// METHODS // METHODS
void evcd(bool flag) { m_evcd = flag; } void evcd(bool flag) { m_evcd = flag; }
public: public:
// CREATORS // CREATORS
VerilatedVcd(VerilatedVcdFile* filep=NULL); explicit VerilatedVcd(VerilatedVcdFile* filep=NULL);
~VerilatedVcd(); ~VerilatedVcd();
// ACCESSORS // ACCESSORS
@@ -399,7 +401,7 @@ class VerilatedVcdC {
VerilatedVcd m_sptrace; ///< Trace file being created VerilatedVcd m_sptrace; ///< Trace file being created
public: public:
// CONSTRUCTORS // CONSTRUCTORS
VerilatedVcdC(VerilatedVcdFile* filep=NULL) : m_sptrace(filep) {} explicit VerilatedVcdC(VerilatedVcdFile* filep=NULL) : m_sptrace(filep) {}
~VerilatedVcdC() {} ~VerilatedVcdC() {}
// ACCESSORS // ACCESSORS
/// Is file open? /// Is file open?
+4 -1
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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.
// //
@@ -30,6 +30,7 @@
//-------------------------------------------------- //--------------------------------------------------
#if (SYSTEMC_VERSION>=20050714) #if (SYSTEMC_VERSION>=20050714)
// SystemC 2.1.v1 // SystemC 2.1.v1
// cppcheck-suppress unusedFunction
void VerilatedVcdSc::write_comment (const std::string &) {} void VerilatedVcdSc::write_comment (const std::string &) {}
void VerilatedVcdSc::trace (const unsigned int &, const std::string &, const char **) {} void VerilatedVcdSc::trace (const unsigned int &, const std::string &, const char **) {}
@@ -74,6 +75,7 @@ void VerilatedVcdSc::trace (const unsigned int &, const std::string &, const cha
//-------------------------------------------------- //--------------------------------------------------
#elif (SYSTEMC_VERSION>20011000) #elif (SYSTEMC_VERSION>20011000)
// SystemC 2.0.1 // SystemC 2.0.1
// cppcheck-suppress unusedFunction
void VerilatedVcdSc::write_comment (const sc_string &) {} void VerilatedVcdSc::write_comment (const sc_string &) {}
void VerilatedVcdSc::trace (const unsigned int &, const sc_string &, const char **) {} void VerilatedVcdSc::trace (const unsigned int &, const sc_string &, const char **) {}
@@ -116,6 +118,7 @@ void VerilatedVcdSc::trace (const unsigned int &, const sc_string &, const char
//-------------------------------------------------- //--------------------------------------------------
#else #else
// SystemC 1.2.1beta // SystemC 1.2.1beta
// cppcheck-suppress unusedFunction
void VerilatedVcdSc::write_comment (const sc_string &) {} void VerilatedVcdSc::write_comment (const sc_string &) {}
void VerilatedVcdSc::trace (const unsigned int &, const sc_string &, const char **) {} void VerilatedVcdSc::trace (const unsigned int &, const sc_string &, const char **) {}
+1 -1
View File
@@ -3,7 +3,7 @@
// //
// THIS MODULE IS PUBLICLY LICENSED // THIS MODULE IS PUBLICLY LICENSED
// //
// Copyright 2001-2015 by Wilson Snyder. This program is free software; // Copyright 2001-2016 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.
// //
+1040 -1
View File
File diff suppressed because it is too large Load Diff
+18 -994
View File
File diff suppressed because it is too large Load Diff
+15 -13
View File
@@ -1,7 +1,7 @@
// -*- mode: C++; c-file-style: "cc-mode" -*- // -*- mode: C++; c-file-style: "cc-mode" -*-
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -95,6 +95,12 @@
// This is not necessarily the same as #UL, depending on what the IData typedef is. // This is not necessarily the same as #UL, depending on what the IData typedef is.
#define VL_UL(c) ((IData)(c##UL)) ///< Add appropriate suffix to 32-bit constant #define VL_UL(c) ((IData)(c##UL)) ///< Add appropriate suffix to 32-bit constant
#ifdef VL_CPPCHECK
# define VL_DANGLING(v)
#else
# define VL_DANGLING(v) do { (v) = NULL; } while(0) ///< After e.g. delete, set variable to NULL to indicate must not use later
#endif
//========================================================================= //=========================================================================
// C++-2011 // C++-2011
@@ -207,19 +213,15 @@ typedef unsigned long long vluint64_t; ///< 64-bit unsigned type
# endif # endif
#endif #endif
#ifdef _WIN32 #if defined(_WIN32) && defined(_MSC_VER)
# define VL_VSNPRINTF vl_vsnprintf # if (_MSC_VER < 1900)
inline int vl_vsnprintf(char* str, size_t size, const char* format, va_list ap) { # define VL_SNPRINTF _snprintf
int count = -1; # else
if (size != 0) { # define VL_SNPRINTF snprintf
count = _vsnprintf_s(str, size, _TRUNCATE, format, ap); # endif
} # define VL_VSNPRINTF vsnprintf
if (count == -1) {
count = _vscprintf(format, ap);
}
return count;
}
#else #else
# define VL_SNPRINTF snprintf
# define VL_VSNPRINTF vsnprintf # define VL_VSNPRINTF vsnprintf
#endif #endif
+1 -1
View File
@@ -785,7 +785,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-2015 by Wilson Snyder. Verilator is free software; you can Copyright 2008-2016 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
View File
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
###################################################################### ######################################################################
# #
# Copyright 2007-2015 by Wilson Snyder. This package is free software; you # Copyright 2007-2016 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
View File
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
###################################################################### ######################################################################
# #
# Copyright 2007-2015 by Wilson Snyder. This package is free software; you # Copyright 2007-2016 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
View File
@@ -143,7 +143,7 @@ Displays this message and program version and exits.
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2005-2015 by Wilson Snyder. Verilator is free software; you can Copyright 2005-2016 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
View File
@@ -184,7 +184,7 @@ Displays this message and program version and exits.
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2005-2015 by Wilson Snyder. Verilator is free software; you can Copyright 2005-2016 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
View File
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
###################################################################### ######################################################################
# #
# Copyright 2007-2015 by Wilson Snyder. This package is free software; you # Copyright 2007-2016 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
View File
@@ -183,7 +183,7 @@ Runs a specific test stage (see the script).
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2009-2015 by Wilson Snyder. This package is free software; you Copyright 2009-2016 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
View File
@@ -28,7 +28,7 @@ invoke_atsim - Invoke tool under "modules" command
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2005-2015 by Wilson Snyder. This package is free software; you Copyright 2005-2016 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
View File
@@ -28,7 +28,7 @@ invoke_iccr - Invoke tool under "modules" command
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2007-2015 by Wilson Snyder. This package is free software; you Copyright 2007-2016 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
View File
@@ -28,7 +28,7 @@ invoke_ncverilog - Invoke tool under "modules" command
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2005-2015 by Wilson Snyder. This package is free software; you Copyright 2005-2016 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
View File
@@ -28,7 +28,7 @@ invoke_vcs - Invoke tool under "modules" command
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2005-2015 by Wilson Snyder. This package is free software; you Copyright 2005-2016 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
View File
@@ -331,7 +331,7 @@ Displays this message and program version and exits.
=head1 DISTRIBUTION =head1 DISTRIBUTION
Copyright 2005-2015 by Wilson Snyder. Verilator is free software; you can Copyright 2005-2016 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
View File
@@ -1,6 +1,6 @@
# DESCRIPTION: Verilator: GDB startup file with useful defines # DESCRIPTION: Verilator: GDB startup file with useful defines
# #
# Copyright 2012-2015 by Wilson Snyder. This program is free software; you can # Copyright 2012-2016 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 -1
View File
@@ -7,7 +7,7 @@
# #
#***************************************************************************** #*****************************************************************************
# #
# Copyright 2003-2015 by Wilson Snyder. This program is free software; you can # Copyright 2003-2016 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.
@@ -46,6 +46,8 @@ obj_opt:
obj_dbg: obj_dbg:
mkdir $@ mkdir $@
.SUFFIXES:
.PHONY: ../verilator_bin ../verilator_bin_dbg ../verilator_coverage_bin_dbg .PHONY: ../verilator_bin ../verilator_bin_dbg ../verilator_coverage_bin_dbg
opt: ../verilator_bin opt: ../verilator_bin
+6 -1
View File
@@ -7,7 +7,7 @@
# #
#***************************************************************************** #*****************************************************************************
# #
# Copyright 2003-2015 by Wilson Snyder. This program is free software; you can # Copyright 2003-2016 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.
@@ -99,6 +99,8 @@ CPPFLAGS += -MP # Only works on recent GCC versions
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
CPPFLAGS += -W -Wall $(CFG_CXXFLAGS_SRC) -Werror CPPFLAGS += -W -Wall $(CFG_CXXFLAGS_SRC) -Werror
#CPPFLAGS += -pedantic-errors #CPPFLAGS += -pedantic-errors
else
CPPFLAGS += $(CFG_CXXFLAGS_SRC)
endif endif
CPPFLAGSWALL = $(CPPFLAGS) CPPFLAGSWALL = $(CPPFLAGS)
CPPFLAGSPARSER = $(CPPFLAGS) $(CFG_CXXFLAGS_PARSER) CPPFLAGSPARSER = $(CPPFLAGS) $(CFG_CXXFLAGS_PARSER)
@@ -235,6 +237,7 @@ RAW_OBJS = \
V3Undriven.o \ V3Undriven.o \
V3Unknown.o \ V3Unknown.o \
V3Unroll.o \ V3Unroll.o \
V3VarResets.o \
V3Width.o \ V3Width.o \
V3WidthSel.o \ V3WidthSel.o \
@@ -327,6 +330,8 @@ V3PreLex_pregen.yy.cpp: V3PreLex.l $(HEADERS)
V3PreLex.yy.cpp: V3PreLex_pregen.yy.cpp $(FLEXFIX) V3PreLex.yy.cpp: V3PreLex_pregen.yy.cpp $(FLEXFIX)
$(PERL) $(FLEXFIX) V3PreLex <$< >$@ $(PERL) $(FLEXFIX) V3PreLex <$< >$@
.SUFFIXES:
###################################################################### ######################################################################
###################################################################### ######################################################################
+10 -10
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -83,7 +83,7 @@ private:
} }
virtual void visit(AstSenTree* nodep, AstNUser*) { virtual void visit(AstSenTree* nodep, AstNUser*) {
// Simplify sensitivity list // Simplify sensitivity list
V3Const::constifyExpensiveEdit(nodep); nodep=NULL; V3Const::constifyExpensiveEdit(nodep); VL_DANGLING(nodep);
} }
// Empty visitors, speed things up // Empty visitors, speed things up
virtual void visit(AstNodeStmt* nodep, AstNUser*) { } virtual void visit(AstNodeStmt* nodep, AstNUser*) { }
@@ -184,7 +184,7 @@ private:
nodep->lhsp()->unlinkFrBack(), nodep->lhsp()->unlinkFrBack(),
nodep->rhsp()->unlinkFrBack()); nodep->rhsp()->unlinkFrBack());
nodep->replaceWith(newp); nodep->replaceWith(newp);
nodep->deleteTree(); nodep = NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
} }
virtual void visit(AstAssign* nodep, AstNUser*) { virtual void visit(AstAssign* nodep, AstNUser*) {
@@ -288,7 +288,7 @@ private:
// Relink to CFUNC for the final // Relink to CFUNC for the final
UINFO(4," FINAL "<<nodep<<endl); UINFO(4," FINAL "<<nodep<<endl);
if (!nodep->bodysp()) { // Empty, Kill it. if (!nodep->bodysp()) { // Empty, Kill it.
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
return; return;
} }
ActiveDlyVisitor dlyvisitor (nodep, ActiveDlyVisitor::CT_INITIAL); ActiveDlyVisitor dlyvisitor (nodep, ActiveDlyVisitor::CT_INITIAL);
@@ -304,7 +304,7 @@ private:
nodep->unlinkFrBack(); nodep->unlinkFrBack();
m_scopeFinalp->addStmtsp(new AstComment(nodep->fileline(), nodep->typeName())); m_scopeFinalp->addStmtsp(new AstComment(nodep->fileline(), nodep->typeName()));
m_scopeFinalp->addStmtsp(nodep->bodysp()->unlinkFrBackWithNext()); m_scopeFinalp->addStmtsp(nodep->bodysp()->unlinkFrBackWithNext());
nodep->deleteTree(); nodep = NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
// METHODS // METHODS
@@ -316,7 +316,7 @@ private:
&& oldsensesp->sensesp()->castSenItem()->isNever()) { && oldsensesp->sensesp()->castSenItem()->isNever()) {
// Never executing. Kill it. // Never executing. Kill it.
if (oldsensesp->sensesp()->nextp()) nodep->v3fatalSrc("Never senitem should be alone, else the never should be eliminated."); if (oldsensesp->sensesp()->nextp()) nodep->v3fatalSrc("Never senitem should be alone, else the never should be eliminated.");
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
return; return;
} }
@@ -351,7 +351,7 @@ private:
// Delete sensitivity list // Delete sensitivity list
if (oldsensesp) { if (oldsensesp) {
oldsensesp->unlinkFrBackWithNext()->deleteTree(); oldsensesp=NULL; oldsensesp->unlinkFrBackWithNext()->deleteTree(); VL_DANGLING(oldsensesp);
} }
// Move node to new active // Move node to new active
@@ -377,7 +377,7 @@ private:
if (!nodep->bodysp()) { if (!nodep->bodysp()) {
// Empty always. Kill it. // Empty always. Kill it.
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
return; return;
} }
visitAlways(nodep, nodep->sensesp(), nodep->keyword()); visitAlways(nodep, nodep->sensesp(), nodep->keyword());
@@ -402,7 +402,7 @@ private:
m_itemCombo = true; m_itemCombo = true;
// Delete the sensitivity // Delete the sensitivity
// We'll add it as a generic COMBO SenItem in a moment. // We'll add it as a generic COMBO SenItem in a moment.
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} else if (nodep->varrefp()) { } else if (nodep->varrefp()) {
// V3LinkResolve should have cleaned most of these up // V3LinkResolve should have cleaned most of these up
if (!nodep->varrefp()->width1()) nodep->v3error("Unsupported: Non-single bit wide signal pos/negedge sensitivity: " if (!nodep->varrefp()->width1()) nodep->v3error("Unsupported: Non-single bit wide signal pos/negedge sensitivity: "
@@ -421,7 +421,7 @@ private:
} }
public: public:
// CONSTUCTORS // CONSTUCTORS
ActiveVisitor(AstNetlist* nodep) { explicit ActiveVisitor(AstNetlist* nodep) {
m_scopeFinalp = NULL; m_scopeFinalp = NULL;
m_itemCombo = false; m_itemCombo = false;
m_itemSequent = false; m_itemSequent = false;
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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,7 +87,7 @@ private:
&& sensesp->sensesp()->castSenItem()->isNever()) { && sensesp->sensesp()->castSenItem()->isNever()) {
// Never executing. Kill it. // Never executing. Kill it.
if (sensesp->sensesp()->nextp()) nodep->v3fatalSrc("Never senitem should be alone, else the never should be eliminated."); if (sensesp->sensesp()->nextp()) nodep->v3fatalSrc("Never senitem should be alone, else the never should be eliminated.");
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
return; return;
} }
// Copy combo tree to settlement tree with duplicated statements // Copy combo tree to settlement tree with duplicated statements
@@ -147,7 +147,7 @@ private:
} }
public: public:
// CONSTUCTORS // CONSTUCTORS
ActiveTopVisitor(AstNetlist* nodep) { explicit ActiveTopVisitor(AstNetlist* nodep) {
m_topscopep = NULL; m_topscopep = NULL;
nodep->accept(*this); nodep->accept(*this);
} }
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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 -6
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2005-2015 by Wilson Snyder. This program is free software; you can // Copyright 2005-2016 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.
@@ -138,7 +138,7 @@ private:
nodep->replaceWith(newp); nodep->replaceWith(newp);
} }
// Bye // Bye
pushDeletep(nodep); nodep=NULL; pushDeletep(nodep); VL_DANGLING(nodep);
} }
void newVAssertion(AstVAssert* nodep, AstNode* propp) { void newVAssertion(AstVAssert* nodep, AstNode* propp) {
@@ -160,7 +160,7 @@ private:
// Install it // Install it
nodep->replaceWith(newp); nodep->replaceWith(newp);
// Bye // Bye
pushDeletep(nodep); nodep=NULL; pushDeletep(nodep); VL_DANGLING(nodep);
} }
virtual void visit(AstIf* nodep, AstNUser*) { virtual void visit(AstIf* nodep, AstNUser*) {
@@ -285,12 +285,12 @@ private:
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
if (m_beginp && nodep->name() == "") nodep->name(m_beginp->name()); if (m_beginp && nodep->name() == "") nodep->name(m_beginp->name());
newPslAssertion(nodep, nodep->propp(), nodep->sentreep(), newPslAssertion(nodep, nodep->propp(), nodep->sentreep(),
nodep->stmtsp(), nodep->name()); nodep=NULL; nodep->stmtsp(), nodep->name()); VL_DANGLING(nodep);
++m_statAsCover; ++m_statAsCover;
} }
virtual void visit(AstVAssert* nodep, AstNUser*) { virtual void visit(AstVAssert* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
newVAssertion(nodep, nodep->propp()); nodep=NULL; newVAssertion(nodep, nodep->propp()); VL_DANGLING(nodep);
++m_statAsSV; ++m_statAsSV;
} }
@@ -317,7 +317,7 @@ private:
} }
public: public:
// CONSTRUCTORS // CONSTRUCTORS
AssertVisitor(AstNetlist* nodep) { explicit AssertVisitor(AstNetlist* nodep) {
m_beginp = NULL; m_beginp = NULL;
m_modp = NULL; m_modp = NULL;
// Process // Process
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2005-2015 by Wilson Snyder. This program is free software; you can // Copyright 2005-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2005-2015 by Wilson Snyder. This program is free software; you can // Copyright 2005-2016 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.
@@ -83,7 +83,7 @@ private:
} else { } else {
nodep->unlinkFrBack(); nodep->unlinkFrBack();
} }
pushDeletep(nodep); nodep=NULL; pushDeletep(nodep); VL_DANGLING(nodep);
} }
virtual void visit(AstPslCover* nodep, AstNUser*) { virtual void visit(AstPslCover* nodep, AstNUser*) {
@@ -109,7 +109,7 @@ private:
// Unlink and just keep a pointer to it, convert to sentree as needed // Unlink and just keep a pointer to it, convert to sentree as needed
m_senip = nodep->sensesp(); m_senip = nodep->sensesp();
nodep->replaceWith(blockp); nodep->replaceWith(blockp);
pushDeletep(nodep); nodep=NULL; pushDeletep(nodep); VL_DANGLING(nodep);
} }
virtual void visit(AstNodeModule* nodep, AstNUser*) { virtual void visit(AstNodeModule* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
@@ -122,7 +122,7 @@ private:
public: public:
// CONSTRUCTORS // CONSTRUCTORS
AssertPreVisitor(AstNetlist* nodep) { explicit AssertPreVisitor(AstNetlist* nodep) {
m_seniDefaultp = NULL; m_seniDefaultp = NULL;
clearAssertInfo(); clearAssertInfo();
// Process // Process
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2005-2015 by Wilson Snyder. This program is free software; you can // Copyright 2005-2016 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.
+97 -86
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -28,6 +28,7 @@
#include "V3File.h" #include "V3File.h"
#include "V3Global.h" #include "V3Global.h"
#include "V3Broken.h" #include "V3Broken.h"
#include "V3String.h"
//====================================================================== //======================================================================
// Statics // Statics
@@ -93,16 +94,16 @@ void AstNode::init() {
string AstNode::encodeName(const string& namein) { string AstNode::encodeName(const string& namein) {
// Encode signal name raw from parser, then not called again on same signal // Encode signal name raw from parser, then not called again on same signal
const char* start = namein.c_str();
string out; string out;
for (const char* pos = start; *pos; pos++) { for (string::const_iterator pos = namein.begin(); pos!=namein.end(); ++pos) {
if ((pos==start) ? isalpha(pos[0]) // digits can't lead identifiers if ((pos==namein.begin()) ? isalpha(pos[0]) // digits can't lead identifiers
: isalnum(pos[0])) { : isalnum(pos[0])) {
out += pos[0]; out += pos[0];
} else if (pos[0]=='_') { } else if (pos[0]=='_') {
if (pos[1]=='_') { if (pos[1]=='_') {
out += "_"; out += "__05F"; // hex(_) = 0x5F out += "_"; out += "__05F"; // hex(_) = 0x5F
pos++; ++pos;
if (pos==namein.end()) break;
} else { } else {
out += pos[0]; out += pos[0];
} }
@@ -115,6 +116,10 @@ string AstNode::encodeName(const string& namein) {
out += hex; out += hex;
} }
} }
// Shorten names
// TODO long term use VName in place of "string name"
VName vname(out);
out = vname.hashedName();
return out; return out;
} }
@@ -194,7 +199,7 @@ string AstNode::prettyName(const string& namein) {
} }
else { else {
pretty += pos[0]; pretty += pos[0];
pos++; ++pos;
} }
} }
if (pretty.substr(0,4) == "TOP.") pretty.replace(0,4,""); if (pretty.substr(0,4) == "TOP.") pretty.replace(0,4,"");
@@ -230,20 +235,20 @@ inline void AstNode::debugTreeChange(const char* prefix, int lineno, bool next)
#endif #endif
} }
AstNode* AstNode::addNext(AstNode* newp) { AstNode* AstNode::addNext(AstNode* nodep, AstNode* newp) {
// Add to m_nextp, returns this // Add to m_nextp, returns this
UASSERT(newp,"Null item passed to addNext\n"); UDEBUGONLY(if (!newp) nodep->v3fatalSrc("Null item passed to addNext"););
this->debugTreeChange("-addNextThs: ", __LINE__, false); nodep->debugTreeChange("-addNextThs: ", __LINE__, false);
newp->debugTreeChange("-addNextNew: ", __LINE__, true); newp->debugTreeChange("-addNextNew: ", __LINE__, true);
if (this == NULL) { if (!nodep) { // verilog.y and lots of other places assume this
return (newp); return (newp);
} else { } else {
// Find end of old list // Find end of old list
AstNode* oldtailp = this; AstNode* oldtailp = nodep;
if (oldtailp->m_nextp) { if (oldtailp->m_nextp) {
if (oldtailp->m_headtailp) { if (oldtailp->m_headtailp) {
oldtailp = oldtailp->m_headtailp; // This=beginning of list, jump to end oldtailp = oldtailp->m_headtailp; // This=beginning of list, jump to end
UASSERT(!oldtailp->m_nextp, "Node had next, but headtail says it shouldn't"); UDEBUGONLY(if (oldtailp->m_nextp) nodep->v3fatalSrc("Node had next, but headtail says it shouldn't"););
} else { } else {
// Though inefficent, we are occasionally passed a addNext in the middle of a list. // Though inefficent, we are occasionally passed a addNext in the middle of a list.
while (oldtailp->m_nextp != NULL) oldtailp = oldtailp->m_nextp; while (oldtailp->m_nextp != NULL) oldtailp = oldtailp->m_nextp;
@@ -262,21 +267,21 @@ AstNode* AstNode::addNext(AstNode* newp) {
newp->editCountInc(); newp->editCountInc();
if (oldtailp->m_iterpp) *(oldtailp->m_iterpp) = newp; // Iterate on new item if (oldtailp->m_iterpp) *(oldtailp->m_iterpp) = newp; // Iterate on new item
} }
this->debugTreeChange("-addNextOut:", __LINE__, true); nodep->debugTreeChange("-addNextOut:", __LINE__, true);
return this; return nodep;
} }
AstNode* AstNode::addNextNull(AstNode* newp) { AstNode* AstNode::addNextNull(AstNode* nodep, AstNode* newp) {
if (!newp) return this; if (!newp) return nodep;
return addNext(newp); return addNext(nodep, newp);
} }
void AstNode::addNextHere(AstNode* newp) { void AstNode::addNextHere(AstNode* newp) {
// Add to m_nextp on exact node passed, not at the end. // Add to m_nextp on exact node passed, not at the end.
// This could be at head, tail, or both (single) // This could be at head, tail, or both (single)
// New could be head of single node, or list // New could be head of single node, or list
UDEBUGONLY(UASSERT(dynamic_cast<AstNode*>(this),"this should not be NULL"););
UASSERT(newp,"Null item passed to addNext"); UASSERT(newp,"Null item passed to addNext");
UASSERT(this,"Null base node");
UASSERT(newp->backp()==NULL,"New node (back) already assigned?"); UASSERT(newp->backp()==NULL,"New node (back) already assigned?");
this->debugTreeChange("-addHereThs: ", __LINE__, false); this->debugTreeChange("-addHereThs: ", __LINE__, false);
newp->debugTreeChange("-addHereNew: ", __LINE__, true); newp->debugTreeChange("-addHereNew: ", __LINE__, true);
@@ -600,12 +605,12 @@ void AstNode::swapWith (AstNode* bp) {
// Clone // Clone
AstNode* AstNode::cloneTreeIter() { AstNode* AstNode::cloneTreeIter() {
if (!this) return NULL; // private: Clone single node and children
AstNode* newp = this->clone(); AstNode* newp = this->clone();
newp->op1p(this->m_op1p->cloneTreeIterList()); if (this->m_op1p) newp->op1p(this->m_op1p->cloneTreeIterList());
newp->op2p(this->m_op2p->cloneTreeIterList()); if (this->m_op2p) newp->op2p(this->m_op2p->cloneTreeIterList());
newp->op3p(this->m_op3p->cloneTreeIterList()); if (this->m_op3p) newp->op3p(this->m_op3p->cloneTreeIterList());
newp->op4p(this->m_op4p->cloneTreeIterList()); if (this->m_op4p) newp->op4p(this->m_op4p->cloneTreeIterList());
newp->m_iterpp = NULL; newp->m_iterpp = NULL;
newp->clonep(this); // Save pointers to/from both to simplify relinking. newp->clonep(this); // Save pointers to/from both to simplify relinking.
this->clonep(newp); // Save pointers to/from both to simplify relinking. this->clonep(newp); // Save pointers to/from both to simplify relinking.
@@ -613,10 +618,10 @@ AstNode* AstNode::cloneTreeIter() {
} }
AstNode* AstNode::cloneTreeIterList() { AstNode* AstNode::cloneTreeIterList() {
// Clone list of nodes, set m_headtailp // private: Clone list of nodes, set m_headtailp
if (!this) return NULL;
AstNode* newheadp = NULL; AstNode* newheadp = NULL;
AstNode* newtailp = NULL; AstNode* newtailp = NULL;
// Audited to make sure this is never NULL
for (AstNode* oldp = this; oldp; oldp=oldp->m_nextp) { for (AstNode* oldp = this; oldp; oldp=oldp->m_nextp) {
AstNode* newp = oldp->cloneTreeIter(); AstNode* newp = oldp->cloneTreeIter();
newp->m_headtailp = NULL; newp->m_headtailp = NULL;
@@ -631,7 +636,7 @@ AstNode* AstNode::cloneTreeIterList() {
} }
AstNode* AstNode::cloneTree(bool cloneNextLink) { AstNode* AstNode::cloneTree(bool cloneNextLink) {
if (!this) return NULL; if (!this) return NULL; // verilog.y relies on this
this->debugTreeChange("-cloneThs: ", __LINE__, cloneNextLink); this->debugTreeChange("-cloneThs: ", __LINE__, cloneNextLink);
cloneClearTree(); cloneClearTree();
AstNode* newp; AstNode* newp;
@@ -652,7 +657,7 @@ AstNode* AstNode::cloneTree(bool cloneNextLink) {
// Delete // Delete
void AstNode::deleteNode() { void AstNode::deleteNode() {
if (!this) return; // private: Delete single node. Publicly call deleteTree() instead.
UASSERT(m_backp==NULL,"Delete called on node with backlink still set\n"); UASSERT(m_backp==NULL,"Delete called on node with backlink still set\n");
editCountInc(); editCountInc();
// Change links of old node so we coredump if used // Change links of old node so we coredump if used
@@ -672,14 +677,15 @@ AstNode::~AstNode() {
} }
void AstNode::deleteTreeIter() { void AstNode::deleteTreeIter() {
if (!this) return; // private: Delete list of nodes. Publicly call deleteTree() instead.
// Audited to make sure this is never NULL
for (AstNode* nodep=this, *nnextp; nodep; nodep=nnextp) { for (AstNode* nodep=this, *nnextp; nodep; nodep=nnextp) {
nnextp = nodep->m_nextp; nnextp = nodep->m_nextp;
// MUST be depth first! // MUST be depth first!
nodep->m_op1p->deleteTreeIter(); if (nodep->m_op1p) nodep->m_op1p->deleteTreeIter();
nodep->m_op2p->deleteTreeIter(); if (nodep->m_op2p) nodep->m_op2p->deleteTreeIter();
nodep->m_op3p->deleteTreeIter(); if (nodep->m_op3p) nodep->m_op3p->deleteTreeIter();
nodep->m_op4p->deleteTreeIter(); if (nodep->m_op4p) nodep->m_op4p->deleteTreeIter();
nodep->m_nextp = NULL; nodep->m_nextp = NULL;
nodep->m_backp = NULL; nodep->m_backp = NULL;
nodep->deleteNode(); nodep->deleteNode();
@@ -689,7 +695,6 @@ void AstNode::deleteTreeIter() {
void AstNode::deleteTree() { void AstNode::deleteTree() {
// deleteTree always deletes the next link, because you must have called // deleteTree always deletes the next link, because you must have called
// unlinkFromBack or unlinkFromBackWithNext as appropriate before calling this. // unlinkFromBack or unlinkFromBackWithNext as appropriate before calling this.
if (!this) return;
UASSERT(m_backp==NULL,"Delete called on node with backlink still set\n"); UASSERT(m_backp==NULL,"Delete called on node with backlink still set\n");
this->debugTreeChange("-delTree: ", __LINE__, true); this->debugTreeChange("-delTree: ", __LINE__, true);
this->editCountInc(); this->editCountInc();
@@ -720,12 +725,10 @@ void AstNode::operator delete(void* objp, size_t size) {
void AstNode::iterateChildren(AstNVisitor& v, AstNUser* vup) { void AstNode::iterateChildren(AstNVisitor& v, AstNUser* vup) {
// This is a very hot function // This is a very hot function
if (!this) return;
ASTNODE_PREFETCH(m_op1p); ASTNODE_PREFETCH(m_op1p);
ASTNODE_PREFETCH(m_op2p); ASTNODE_PREFETCH(m_op2p);
ASTNODE_PREFETCH(m_op3p); ASTNODE_PREFETCH(m_op3p);
ASTNODE_PREFETCH(m_op4p); ASTNODE_PREFETCH(m_op4p);
// if () not needed since iterateAndNext accepts null this, but faster with it.
if (m_op1p) m_op1p->iterateAndNext(v, vup); if (m_op1p) m_op1p->iterateAndNext(v, vup);
if (m_op2p) m_op2p->iterateAndNext(v, vup); if (m_op2p) m_op2p->iterateAndNext(v, vup);
if (m_op3p) m_op3p->iterateAndNext(v, vup); if (m_op3p) m_op3p->iterateAndNext(v, vup);
@@ -734,12 +737,10 @@ void AstNode::iterateChildren(AstNVisitor& v, AstNUser* vup) {
void AstNode::iterateChildrenConst(AstNVisitor& v, AstNUser* vup) { void AstNode::iterateChildrenConst(AstNVisitor& v, AstNUser* vup) {
// This is a very hot function // This is a very hot function
if (!this) return;
ASTNODE_PREFETCH(m_op1p); ASTNODE_PREFETCH(m_op1p);
ASTNODE_PREFETCH(m_op2p); ASTNODE_PREFETCH(m_op2p);
ASTNODE_PREFETCH(m_op3p); ASTNODE_PREFETCH(m_op3p);
ASTNODE_PREFETCH(m_op4p); ASTNODE_PREFETCH(m_op4p);
// if () not needed since iterateAndNext accepts null this, but faster with it.
if (m_op1p) m_op1p->iterateAndNextConst(v, vup); if (m_op1p) m_op1p->iterateAndNextConst(v, vup);
if (m_op2p) m_op2p->iterateAndNextConst(v, vup); if (m_op2p) m_op2p->iterateAndNextConst(v, vup);
if (m_op3p) m_op3p->iterateAndNextConst(v, vup); if (m_op3p) m_op3p->iterateAndNextConst(v, vup);
@@ -750,14 +751,13 @@ void AstNode::iterateAndNext(AstNVisitor& v, AstNUser* vup) {
// This is a very hot function // This is a very hot function
// IMPORTANT: If you replace a node that's the target of this iterator, // IMPORTANT: If you replace a node that's the target of this iterator,
// then the NEW node will be iterated on next, it isn't skipped! // then the NEW node will be iterated on next, it isn't skipped!
// if (!this) return; // Part of for()
// Future versions of this function may require the node to have a back to be iterated; // Future versions of this function may require the node to have a back to be iterated;
// there's no lower level reason yet though the back must exist. // there's no lower level reason yet though the back must exist.
AstNode* nodep=this; AstNode* nodep=this;
#ifdef VL_DEBUG // Otherwise too hot of a function for debug #ifdef VL_DEBUG // Otherwise too hot of a function for debug
if (VL_UNLIKELY(nodep && !nodep->m_backp)) nodep->v3fatalSrc("iterateAndNext node has no back"); if (VL_UNLIKELY(nodep && !nodep->m_backp)) nodep->v3fatalSrc("iterateAndNext node has no back");
#endif #endif
while (nodep) { while (nodep) { // effectively: if (!this) return; // Callers rely on this
AstNode* niterp = nodep; // This address may get stomped via m_iterpp if the node is edited AstNode* niterp = nodep; // This address may get stomped via m_iterpp if the node is edited
ASTNODE_PREFETCH(nodep->m_nextp); ASTNODE_PREFETCH(nodep->m_nextp);
// Desirable check, but many places where multiple iterations are OK // Desirable check, but many places where multiple iterations are OK
@@ -778,7 +778,7 @@ void AstNode::iterateAndNext(AstNVisitor& v, AstNUser* vup) {
} }
void AstNode::iterateListBackwards(AstNVisitor& v, AstNUser* vup) { void AstNode::iterateListBackwards(AstNVisitor& v, AstNUser* vup) {
if (!this) return; UDEBUGONLY(UASSERT(dynamic_cast<AstNode*>(this),"this should not be NULL"););
AstNode* nodep=this; AstNode* nodep=this;
while (nodep->m_nextp) nodep=nodep->m_nextp; while (nodep->m_nextp) nodep=nodep->m_nextp;
while (nodep) { while (nodep) {
@@ -790,17 +790,16 @@ void AstNode::iterateListBackwards(AstNVisitor& v, AstNUser* vup) {
} }
void AstNode::iterateChildrenBackwards(AstNVisitor& v, AstNUser* vup) { void AstNode::iterateChildrenBackwards(AstNVisitor& v, AstNUser* vup) {
if (!this) return; if (m_op1p) m_op1p->iterateListBackwards(v,vup);
this->op1p()->iterateListBackwards(v,vup); if (m_op2p) m_op2p->iterateListBackwards(v,vup);
this->op2p()->iterateListBackwards(v,vup); if (m_op3p) m_op3p->iterateListBackwards(v,vup);
this->op3p()->iterateListBackwards(v,vup); if (m_op4p) m_op4p->iterateListBackwards(v,vup);
this->op4p()->iterateListBackwards(v,vup);
} }
void AstNode::iterateAndNextConst(AstNVisitor& v, AstNUser* vup) { void AstNode::iterateAndNextConst(AstNVisitor& v, AstNUser* vup) {
// Keep following the current list even if edits change it // Keep following the current list even if edits change it
if (!this) return; if (!this) return; // A few cases could be cleaned up, but want symmetry with iterateAndNext
for (AstNode* nodep=this; nodep; ) { for (AstNode* nodep=this; nodep; ) { // effectively: if (!this) return; // Callers rely on this
AstNode* nnextp = nodep->m_nextp; AstNode* nnextp = nodep->m_nextp;
ASTNODE_PREFETCH(nnextp); ASTNODE_PREFETCH(nnextp);
nodep->accept(v, vup); nodep->accept(v, vup);
@@ -823,10 +822,10 @@ AstNode* AstNode::acceptSubtreeReturnEdits(AstNVisitor& v, AstNUser* vup) {
// Calling on standalone tree; insert a shim node so we can keep track, then delete it on completion // Calling on standalone tree; insert a shim node so we can keep track, then delete it on completion
AstBegin* tempp = new AstBegin(nodep->fileline(),"[EditWrapper]",nodep); AstBegin* tempp = new AstBegin(nodep->fileline(),"[EditWrapper]",nodep);
{ {
tempp->stmtsp()->accept(v, vup); nodep=NULL; // nodep to null as may be replaced tempp->stmtsp()->accept(v, vup); VL_DANGLING(nodep); // nodep to null as may be replaced
} }
nodep = tempp->stmtsp()->unlinkFrBackWithNext(); nodep = tempp->stmtsp()->unlinkFrBackWithNext();
tempp->deleteTree(); tempp=NULL; tempp->deleteTree(); VL_DANGLING(tempp);
} else { } else {
// Use back to determine who's pointing at us (IE assume new node grafts into same place as old one) // Use back to determine who's pointing at us (IE assume new node grafts into same place as old one)
AstNode** nextnodepp = NULL; AstNode** nextnodepp = NULL;
@@ -837,7 +836,7 @@ AstNode* AstNode::acceptSubtreeReturnEdits(AstNVisitor& v, AstNUser* vup) {
else if (this->m_backp->m_nextp == this) nextnodepp = &(this->m_backp->m_nextp); else if (this->m_backp->m_nextp == this) nextnodepp = &(this->m_backp->m_nextp);
if (!nextnodepp) this->v3fatalSrc("Node's back doesn't point to forward to node itself"); if (!nextnodepp) this->v3fatalSrc("Node's back doesn't point to forward to node itself");
{ {
nodep->accept(v, vup); nodep=NULL; // nodep to null as may be replaced nodep->accept(v, vup); VL_DANGLING(nodep); // nodep to null as may be replaced
} }
nodep = *nextnodepp; // Grab new node from point where old was connected nodep = *nextnodepp; // Grab new node from point where old was connected
} }
@@ -847,37 +846,47 @@ AstNode* AstNode::acceptSubtreeReturnEdits(AstNVisitor& v, AstNUser* vup) {
//====================================================================== //======================================================================
void AstNode::cloneRelinkTree() { void AstNode::cloneRelinkTree() {
if (!this) return; // private: Cleanup clone() operation on whole tree. Publicly call cloneTree() instead.
for (AstNode* nodep=this; nodep; nodep=nodep->m_nextp) { for (AstNode* nodep=this; nodep; nodep=nodep->m_nextp) {
if (m_dtypep && m_dtypep->clonep()) { if (m_dtypep && m_dtypep->clonep()) {
m_dtypep = m_dtypep->clonep()->castNodeDType(); m_dtypep = m_dtypep->clonep()->castNodeDType();
} }
nodep->cloneRelink(); nodep->cloneRelink();
nodep->m_op1p->cloneRelinkTree(); if (nodep->m_op1p) nodep->m_op1p->cloneRelinkTree();
nodep->m_op2p->cloneRelinkTree(); if (nodep->m_op2p) nodep->m_op2p->cloneRelinkTree();
nodep->m_op3p->cloneRelinkTree(); if (nodep->m_op3p) nodep->m_op3p->cloneRelinkTree();
nodep->m_op4p->cloneRelinkTree(); if (nodep->m_op4p) nodep->m_op4p->cloneRelinkTree();
} }
} }
//====================================================================== //======================================================================
// Comparison // Comparison
bool AstNode::sameTreeIter(AstNode* node2p, bool ignNext, bool gateOnly) { bool AstNode::gateTreeIter() {
// Return true if the two trees are identical // private: Return true if the two trees are identical
if (this==NULL && node2p==NULL) return true; if (!isGateOptimizable()) return false;
if (this==NULL || node2p==NULL) return false; if (m_op1p && !m_op1p->gateTreeIter()) return false;
if (this->type() != node2p->type() if (m_op2p && !m_op2p->gateTreeIter()) return false;
|| this->dtypep() != node2p->dtypep() if (m_op3p && !m_op3p->gateTreeIter()) return false;
|| !this->same(node2p) if (m_op4p && !m_op4p->gateTreeIter()) return false;
|| (gateOnly && !this->isGateOptimizable())) { return true;
}
bool AstNode::sameTreeIter(AstNode* node1p, AstNode* node2p, bool ignNext, bool gateOnly) {
// private: Return true if the two trees are identical
if (!node1p && !node2p) return true;
if (!node1p || !node2p) return false;
if (node1p->type() != node2p->type()
|| node1p->dtypep() != node2p->dtypep()
|| !node1p->same(node2p)
|| (gateOnly && !node1p->isGateOptimizable())) {
return false; return false;
} }
return (this->op1p()->sameTreeIter(node2p->op1p(),false,gateOnly) return (sameTreeIter(node1p->m_op1p, node2p->m_op1p,false,gateOnly)
&& this->op2p()->sameTreeIter(node2p->op2p(),false,gateOnly) && sameTreeIter(node1p->m_op2p, node2p->m_op2p,false,gateOnly)
&& this->op3p()->sameTreeIter(node2p->op3p(),false,gateOnly) && sameTreeIter(node1p->m_op3p, node2p->m_op3p,false,gateOnly)
&& this->op4p()->sameTreeIter(node2p->op4p(),false,gateOnly) && sameTreeIter(node1p->m_op4p, node2p->m_op4p,false,gateOnly)
&& (ignNext || this->nextp()->sameTreeIter(node2p->nextp(),false,gateOnly)) && (ignNext || sameTreeIter(node1p->m_nextp, node2p->m_nextp,false,gateOnly))
); );
} }
@@ -901,6 +910,7 @@ V3Hash::V3Hash(const string& name) {
// Debugging // Debugging
void AstNode::checkTreeIter(AstNode* backp) { void AstNode::checkTreeIter(AstNode* backp) {
// private: Check a tree and children
if (backp != this->backp()) { if (backp != this->backp()) {
this->v3fatalSrc("Back node inconsistent"); this->v3fatalSrc("Back node inconsistent");
} }
@@ -909,15 +919,15 @@ void AstNode::checkTreeIter(AstNode* backp) {
if (op1p()||op2p()||op3p()||op4p()) if (op1p()||op2p()||op3p()||op4p())
this->v3fatalSrc("Terminal operation with non-terminals"); this->v3fatalSrc("Terminal operation with non-terminals");
} }
if (op1p()) op1p()->checkTreeIterList(this); if (m_op1p) m_op1p->checkTreeIterList(this);
if (op2p()) op2p()->checkTreeIterList(this); if (m_op2p) m_op2p->checkTreeIterList(this);
if (op3p()) op3p()->checkTreeIterList(this); if (m_op3p) m_op3p->checkTreeIterList(this);
if (op4p()) op4p()->checkTreeIterList(this); if (m_op4p) m_op4p->checkTreeIterList(this);
} }
void AstNode::checkTreeIterList(AstNode* backp) { void AstNode::checkTreeIterList(AstNode* backp) {
// Check a (possible) list of nodes, this is always the head of the list // private: Check a (possible) list of nodes, this is always the head of the list
if (!this) v3fatalSrc("Null nodep"); // Audited to make sure this is never NULL
AstNode* headp = this; AstNode* headp = this;
AstNode* tailp = this; AstNode* tailp = this;
for (AstNode* nodep=headp; nodep; nodep=nodep->nextp()) { for (AstNode* nodep=headp; nodep; nodep=nodep->nextp()) {
@@ -931,7 +941,6 @@ void AstNode::checkTreeIterList(AstNode* backp) {
} }
void AstNode::checkTree() { void AstNode::checkTree() {
if (!this) return;
if (!debug()) return; if (!debug()) return;
if (this->backp()) { if (this->backp()) {
// Linked tree- check only the passed node // Linked tree- check only the passed node
@@ -942,17 +951,17 @@ void AstNode::checkTree() {
} }
void AstNode::dumpGdb() { // For GDB only void AstNode::dumpGdb() { // For GDB only
if (!this) { cout<<"This=NULL"<<endl; return; } if (!dynamic_cast<const AstNode*>(this)) { cout<<"This=NULL"<<endl; return; }
dumpGdbHeader(); dumpGdbHeader();
cout<<" "; dump(cout); cout<<endl; cout<<" "; dump(cout); cout<<endl;
} }
void AstNode::dumpGdbHeader() const { // For GDB only void AstNode::dumpGdbHeader() const { // For GDB only
if (!this) { cout<<"This=NULL"<<endl; return; } if (!dynamic_cast<const AstNode*>(this)) { cout<<"This=NULL"<<endl; return; }
dumpPtrs(cout); dumpPtrs(cout);
cout<<" Fileline = "<<fileline()<<endl; cout<<" Fileline = "<<fileline()<<endl;
} }
void AstNode::dumpTreeGdb() { // For GDB only void AstNode::dumpTreeGdb() { // For GDB only
if (!this) { cout<<"This=NULL"<<endl; return; } if (!dynamic_cast<const AstNode*>(this)) { cout<<"This=NULL"<<endl; return; }
dumpGdbHeader(); dumpGdbHeader();
dumpTree(cout); dumpTree(cout);
} }
@@ -992,7 +1001,6 @@ void AstNode::dumpPtrs(ostream& os) const {
} }
void AstNode::dumpTree(ostream& os, const string& indent, int maxDepth) { void AstNode::dumpTree(ostream& os, const string& indent, int maxDepth) {
if (!this) return;
os<<indent<<" "<<this<<endl; os<<indent<<" "<<this<<endl;
if (debug()>8) { os<<indent<<" "; dumpPtrs(os); } if (debug()>8) { os<<indent<<" "; dumpPtrs(os); }
if (maxDepth==1) { if (maxDepth==1) {
@@ -1006,7 +1014,7 @@ void AstNode::dumpTree(ostream& os, const string& indent, int maxDepth) {
} }
void AstNode::dumpTreeAndNext(ostream& os, const string& indent, int maxDepth) { void AstNode::dumpTreeAndNext(ostream& os, const string& indent, int maxDepth) {
if (!this) return; // Audited to make sure this is never NULL
for (AstNode* nodep=this; nodep; nodep=nodep->nextp()) { for (AstNode* nodep=this; nodep; nodep=nodep->nextp()) {
nodep->dumpTree(os, indent, maxDepth); nodep->dumpTree(os, indent, maxDepth);
} }
@@ -1016,7 +1024,7 @@ void AstNode::dumpTreeFile(const string& filename, bool append, bool doDump) {
if (doDump) { if (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 VL_UNIQUE_PTR<ofstream> logsp (V3File::new_ofstream(filename, append));
if (logsp->fail()) v3fatalSrc("Can't write "<<filename); if (logsp->fail()) v3fatalSrc("Can't write "<<filename);
*logsp<<"Verilator Tree Dump (format 0x3900) from <e"<<dec<<editCountLast()<<">"; *logsp<<"Verilator Tree Dump (format 0x3900) from <e"<<dec<<editCountLast()<<">";
*logsp<<" to <e"<<dec<<editCountGbl()<<">"<<endl; *logsp<<" to <e"<<dec<<editCountGbl()<<">"<<endl;
@@ -1041,7 +1049,13 @@ void AstNode::dumpTreeFile(const string& filename, bool append, bool doDump) {
} }
void AstNode::v3errorEnd(ostringstream& str) const { void AstNode::v3errorEnd(ostringstream& str) const {
if (this && m_fileline) { if (!dynamic_cast<const AstNode*>(this)) {
// No known cases cause this, but better than a core dump
if (debug()) UINFO(0, "-node: NULL. Please report this along with a --gdbbt backtrace as a Verilator bug.\n");
V3Error::v3errorEnd(str);
} else if (!m_fileline) {
V3Error::v3errorEnd(str);
} else {
ostringstream nsstr; ostringstream nsstr;
nsstr<<str.str(); nsstr<<str.str();
if (debug()) { if (debug()) {
@@ -1049,14 +1063,11 @@ void AstNode::v3errorEnd(ostringstream& str) const {
nsstr<<"-node: "; ((AstNode*)this)->dump(nsstr); nsstr<<endl; nsstr<<"-node: "; ((AstNode*)this)->dump(nsstr); nsstr<<endl;
} }
m_fileline->v3errorEnd(nsstr); m_fileline->v3errorEnd(nsstr);
} else {
V3Error::v3errorEnd(str);
} }
} }
string AstNode::warnMore() const { string AstNode::warnMore() const {
if (this) return this->fileline()->warnMore(); return fileline()->warnMore();
else return V3Error::warnMore();
} }
//====================================================================== //======================================================================
+53 -23
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -53,6 +53,7 @@ public:
enum en m_e; enum en m_e;
// cppcheck-suppress uninitVar // responsiblity of each subclass // cppcheck-suppress uninitVar // responsiblity of each subclass
inline AstType () {} inline AstType () {}
// cppcheck-suppress noExplicitConstructor
inline AstType (en _e) : m_e(_e) {} inline AstType (en _e) : m_e(_e) {}
explicit inline AstType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -87,7 +88,9 @@ public:
return names[m_e]; return names[m_e];
}; };
inline AstNumeric () : m_e(UNSIGNED) {} inline AstNumeric () : m_e(UNSIGNED) {}
// cppcheck-suppress noExplicitConstructor
inline AstNumeric (en _e) : m_e(_e) {} inline AstNumeric (en _e) : m_e(_e) {}
// cppcheck-suppress noExplicitConstructor
inline AstNumeric (VSignedState signst) { inline AstNumeric (VSignedState signst) {
if (signst==signedst_UNSIGNED) m_e=UNSIGNED; if (signst==signedst_UNSIGNED) m_e=UNSIGNED;
else if (signst==signedst_SIGNED) m_e=SIGNED; else if (signst==signedst_SIGNED) m_e=SIGNED;
@@ -121,6 +124,7 @@ public:
}; };
enum en m_e; enum en m_e;
inline AstPragmaType () : m_e(ILLEGAL) {} inline AstPragmaType () : m_e(ILLEGAL) {}
// cppcheck-suppress noExplicitConstructor
inline AstPragmaType (en _e) : m_e(_e) {} inline AstPragmaType (en _e) : m_e(_e) {}
explicit inline AstPragmaType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstPragmaType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -144,6 +148,7 @@ public:
}; };
enum en m_e; enum en m_e;
inline AstCFuncType () : m_e(FT_NORMAL) {} inline AstCFuncType () : m_e(FT_NORMAL) {}
// cppcheck-suppress noExplicitConstructor
inline AstCFuncType (en _e) : m_e(_e) {} inline AstCFuncType (en _e) : m_e(_e) {}
explicit inline AstCFuncType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstCFuncType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -212,6 +217,7 @@ public:
return names[m_e]; return names[m_e];
}; };
inline AstEdgeType () : m_e(ET_ILLEGAL) {} inline AstEdgeType () : m_e(ET_ILLEGAL) {}
// cppcheck-suppress noExplicitConstructor
inline AstEdgeType (en _e) : m_e(_e) {} inline AstEdgeType (en _e) : m_e(_e) {}
explicit inline AstEdgeType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstEdgeType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -239,6 +245,7 @@ public:
// //
DT_PUBLIC, // V3LinkParse moves to AstTypedef::attrPublic DT_PUBLIC, // V3LinkParse moves to AstTypedef::attrPublic
// //
ENUM_BASE, // V3LinkResolve creates for AstPreSel, V3LinkParam removes
ENUM_FIRST, // V3Width processes ENUM_FIRST, // V3Width processes
ENUM_LAST, // V3Width processes ENUM_LAST, // V3Width processes
ENUM_NUM, // V3Width processes ENUM_NUM, // V3Width processes
@@ -268,7 +275,7 @@ public:
"DIM_BITS", "DIM_DIMENSIONS", "DIM_HIGH", "DIM_INCREMENT", "DIM_LEFT", "DIM_BITS", "DIM_DIMENSIONS", "DIM_HIGH", "DIM_INCREMENT", "DIM_LEFT",
"DIM_LOW", "DIM_RIGHT", "DIM_SIZE", "DIM_UNPK_DIMENSIONS", "DIM_LOW", "DIM_RIGHT", "DIM_SIZE", "DIM_UNPK_DIMENSIONS",
"DT_PUBLIC", "DT_PUBLIC",
"ENUM_FIRST", "ENUM_LAST", "ENUM_NUM", "ENUM_NEXT", "ENUM_PREV", "ENUM_NAME", "ENUM_BASE", "ENUM_FIRST", "ENUM_LAST", "ENUM_NUM", "ENUM_NEXT", "ENUM_PREV", "ENUM_NAME",
"MEMBER_BASE", "MEMBER_BASE",
"VAR_BASE", "VAR_CLOCK", "VAR_CLOCK_ENABLE", "VAR_PUBLIC", "VAR_BASE", "VAR_CLOCK", "VAR_CLOCK_ENABLE", "VAR_PUBLIC",
"VAR_PUBLIC_FLAT", "VAR_PUBLIC_FLAT_RD","VAR_PUBLIC_FLAT_RW", "VAR_PUBLIC_FLAT", "VAR_PUBLIC_FLAT_RD","VAR_PUBLIC_FLAT_RW",
@@ -278,6 +285,7 @@ public:
return names[m_e]; return names[m_e];
}; };
inline AstAttrType () : m_e(ILLEGAL) {} inline AstAttrType () : m_e(ILLEGAL) {}
// cppcheck-suppress noExplicitConstructor
inline AstAttrType (en _e) : m_e(_e) {} inline AstAttrType (en _e) : m_e(_e) {}
explicit inline AstAttrType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstAttrType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -337,6 +345,7 @@ public:
UASSERT(0==strcmp(AstBasicDTypeKwd(_ENUM_MAX).dpiType()," MAX"),"Enum array mismatch"); UASSERT(0==strcmp(AstBasicDTypeKwd(_ENUM_MAX).dpiType()," MAX"),"Enum array mismatch");
} }
inline AstBasicDTypeKwd () : m_e(UNKNOWN) {} inline AstBasicDTypeKwd () : m_e(UNKNOWN) {}
// cppcheck-suppress noExplicitConstructor
inline AstBasicDTypeKwd (en _e) : m_e(_e) {} inline AstBasicDTypeKwd (en _e) : m_e(_e) {}
explicit inline AstBasicDTypeKwd (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstBasicDTypeKwd (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -431,6 +440,7 @@ public:
}; };
enum en m_e; enum en m_e;
inline AstVarType () : m_e(UNKNOWN) {} inline AstVarType () : m_e(UNKNOWN) {}
// cppcheck-suppress noExplicitConstructor
inline AstVarType (en _e) : m_e(_e) {} inline AstVarType (en _e) : m_e(_e) {}
explicit inline AstVarType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstVarType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -468,6 +478,7 @@ public:
enum en m_e; enum en m_e;
// CONSTRUCTOR - note defaults to *UNKNOWN* // CONSTRUCTOR - note defaults to *UNKNOWN*
inline AstBranchPred () : m_e(BP_UNKNOWN) {} inline AstBranchPred () : m_e(BP_UNKNOWN) {}
// cppcheck-suppress noExplicitConstructor
inline AstBranchPred (en _e) : m_e(_e) {} inline AstBranchPred (en _e) : m_e(_e) {}
explicit inline AstBranchPred (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstBranchPred (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -499,9 +510,11 @@ public:
enum en m_e; enum en m_e;
// CONSTRUCTOR - note defaults to *UNKNOWN* // CONSTRUCTOR - note defaults to *UNKNOWN*
inline AstVarAttrClocker () : m_e(CLOCKER_UNKNOWN) {} inline AstVarAttrClocker () : m_e(CLOCKER_UNKNOWN) {}
// cppcheck-suppress noExplicitConstructor
inline AstVarAttrClocker (en _e) : m_e(_e) {} inline AstVarAttrClocker (en _e) : m_e(_e) {}
explicit inline AstVarAttrClocker (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstVarAttrClocker (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
bool unknown() const { return m_e==CLOCKER_UNKNOWN; }
AstVarAttrClocker invert() const { AstVarAttrClocker invert() const {
if (m_e==CLOCKER_YES) return CLOCKER_NO; if (m_e==CLOCKER_YES) return CLOCKER_NO;
else if (m_e==CLOCKER_NO) return CLOCKER_YES; else if (m_e==CLOCKER_NO) return CLOCKER_YES;
@@ -529,6 +542,7 @@ public:
}; };
enum en m_e; enum en m_e;
inline VAlwaysKwd () : m_e(ALWAYS) {} inline VAlwaysKwd () : m_e(ALWAYS) {}
// cppcheck-suppress noExplicitConstructor
inline VAlwaysKwd (en _e) : m_e(_e) {} inline VAlwaysKwd (en _e) : m_e(_e) {}
explicit inline VAlwaysKwd (int _e) : m_e(static_cast<en>(_e)) {} explicit inline VAlwaysKwd (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -553,6 +567,7 @@ public:
}; };
enum en m_e; enum en m_e;
inline VCaseType () : m_e(CT_CASE) {} inline VCaseType () : m_e(CT_CASE) {}
// cppcheck-suppress noExplicitConstructor
inline VCaseType (en _e) : m_e(_e) {} inline VCaseType (en _e) : m_e(_e) {}
explicit inline VCaseType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline VCaseType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -575,6 +590,7 @@ public:
}; };
enum en m_e; enum en m_e;
inline AstDisplayType () : m_e(DT_DISPLAY) {} inline AstDisplayType () : m_e(DT_DISPLAY) {}
// cppcheck-suppress noExplicitConstructor
inline AstDisplayType (en _e) : m_e(_e) {} inline AstDisplayType (en _e) : m_e(_e) {}
explicit inline AstDisplayType (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstDisplayType (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -599,6 +615,7 @@ public:
}; };
enum en m_e; enum en m_e;
inline AstParseRefExp() : m_e(PX_NONE) {} inline AstParseRefExp() : m_e(PX_NONE) {}
// cppcheck-suppress noExplicitConstructor
inline AstParseRefExp (en _e) : m_e(_e) {} inline AstParseRefExp (en _e) : m_e(_e) {}
explicit inline AstParseRefExp (int _e) : m_e(static_cast<en>(_e)) {} explicit inline AstParseRefExp (int _e) : m_e(static_cast<en>(_e)) {}
operator en () const { return m_e; } operator en () const { return m_e; }
@@ -845,7 +862,8 @@ public:
} }
#include "V3Ast__gen_visitor.h" // From ./astgen #include "V3Ast__gen_visitor.h" // From ./astgen
// Things like: // Things like:
// virtual void visit(type*) = 0; // virtual void visit(AstBreak* nodep, AstNUser* vup) { visit((AstNodeStmt*)(nodep),vup); }
// virtual void visit(AstNodeStmt* nodep, AstNUser* vup) { visit((AstNode*)(nodep),vup); }
}; };
//###################################################################### //######################################################################
@@ -896,16 +914,19 @@ public:
// CREATORS // CREATORS
class Illegal {}; // for creator type-overload selection class Illegal {}; // for creator type-overload selection
class FullValue {}; // for creator type-overload selection class FullValue {}; // for creator type-overload selection
V3Hash(Illegal) { m_both=0; } explicit V3Hash(Illegal) { m_both=0; }
// Saving and restoring inside a userp // Saving and restoring inside a userp
V3Hash(AstNUser* up) { m_both=up->castInt(); } explicit V3Hash(AstNUser* up) { m_both=up->castInt(); }
V3Hash operator+= (const V3Hash& rh) { V3Hash operator+= (const V3Hash& rh) {
setBoth(depth()+rh.depth(), (hshval()*31+rh.hshval())); setBoth(depth()+rh.depth(), (hshval()*31+rh.hshval()));
return *this; }; return *this; };
// Creating from raw data (sameHash functions) // Creating from raw data (sameHash functions)
V3Hash() { setBoth(1,0); } V3Hash() { setBoth(1,0); }
// cppcheck-suppress noExplicitConstructor
V3Hash(uint32_t val) { setBoth(1,val); } V3Hash(uint32_t val) { setBoth(1,val); }
// cppcheck-suppress noExplicitConstructor
V3Hash(const void* vp) { setBoth(1,cvtToHash(vp)); } V3Hash(const void* vp) { setBoth(1,cvtToHash(vp)); }
// cppcheck-suppress noExplicitConstructor
V3Hash(const string& name); V3Hash(const string& name);
V3Hash(V3Hash h1, V3Hash h2) { V3Hash(V3Hash h1, V3Hash h2) {
setBoth(1,h1.hshval()*31+h2.hshval()); } setBoth(1,h1.hshval()*31+h2.hshval()); }
@@ -973,13 +994,16 @@ class AstNode {
void init(); // initialize value of AstNode void init(); // initialize value of AstNode
void iterateListBackwards(AstNVisitor& v, AstNUser* vup=NULL); void iterateListBackwards(AstNVisitor& v, AstNUser* vup=NULL);
private:
AstNode* cloneTreeIter(); AstNode* cloneTreeIter();
AstNode* cloneTreeIterList(); AstNode* cloneTreeIterList();
void checkTreeIter(AstNode* backp); void checkTreeIter(AstNode* backp);
void checkTreeIterList(AstNode* backp); void checkTreeIterList(AstNode* backp);
bool sameTreeIter(AstNode* node2p, bool ignNext, bool gateOnly); bool gateTreeIter();
bool sameTreeIter(AstNode* node1p, AstNode* node2p, bool ignNext, bool gateOnly);
void deleteTreeIter(); void deleteTreeIter();
void deleteNode(); void deleteNode();
public:
static void relinkOneLink(AstNode*& pointpr, AstNode* newp); static void relinkOneLink(AstNode*& pointpr, AstNode* newp);
// cppcheck-suppress functionConst // cppcheck-suppress functionConst
void debugTreeChange(const char* prefix, int lineno, bool next); void debugTreeChange(const char* prefix, int lineno, bool next);
@@ -987,7 +1011,7 @@ class AstNode {
protected: protected:
// CONSTUCTORS // CONSTUCTORS
AstNode() {init(); } AstNode() {init(); }
AstNode(FileLine* fileline) {init(); m_fileline = fileline; } explicit AstNode(FileLine* fileline) {init(); m_fileline = fileline; }
virtual AstNode* clone() = 0; // Generally, cloneTree is what you want instead virtual AstNode* clone() = 0; // Generally, cloneTree is what you want instead
virtual void cloneRelink() {} virtual void cloneRelink() {}
void cloneRelinkTree(); void cloneRelinkTree();
@@ -1095,7 +1119,7 @@ public:
void user1p(void* userp) { m_user1p=(AstNUser*)(userp); m_user1Cnt=AstUser1InUse::s_userCntGbl; } void user1p(void* userp) { m_user1p=(AstNUser*)(userp); m_user1Cnt=AstUser1InUse::s_userCntGbl; }
int user1() const { return user1p()->castInt(); } int user1() const { return user1p()->castInt(); }
void user1(int val) { user1p(AstNUser::fromInt(val)); } void user1(int val) { user1p(AstNUser::fromInt(val)); }
int user1Inc() { int v=user1(); user1(v+1); return v; } int user1Inc(int val=1) { int v=user1(); user1(v+val); return v; }
int user1SetOnce() { int v=user1(); if (!v) user1(1); return v; } // Better for cache than user1Inc() int user1SetOnce() { int v=user1(); if (!v) user1(1); return v; } // Better for cache than user1Inc()
static void user1ClearTree() { AstUser1InUse::clear(); } // Clear userp()'s across the entire tree static void user1ClearTree() { AstUser1InUse::clear(); } // Clear userp()'s across the entire tree
@@ -1105,7 +1129,7 @@ public:
void user2p(void* userp) { m_user2p=(AstNUser*)(userp); m_user2Cnt=AstUser2InUse::s_userCntGbl; } void user2p(void* userp) { m_user2p=(AstNUser*)(userp); m_user2Cnt=AstUser2InUse::s_userCntGbl; }
int user2() const { return user2p()->castInt(); } int user2() const { return user2p()->castInt(); }
void user2(int val) { user2p(AstNUser::fromInt(val)); } void user2(int val) { user2p(AstNUser::fromInt(val)); }
int user2Inc() { int v=user2(); user2(v+1); return v; } int user2Inc(int val=1) { int v=user2(); user2(v+val); return v; }
int user2SetOnce() { int v=user2(); if (!v) user2(1); return v; } int user2SetOnce() { int v=user2(); if (!v) user2(1); return v; }
static void user2ClearTree() { AstUser2InUse::clear(); } static void user2ClearTree() { AstUser2InUse::clear(); }
@@ -1115,7 +1139,7 @@ public:
void user3p(void* userp) { m_user3p=(AstNUser*)(userp); m_user3Cnt=AstUser3InUse::s_userCntGbl; } void user3p(void* userp) { m_user3p=(AstNUser*)(userp); m_user3Cnt=AstUser3InUse::s_userCntGbl; }
int user3() const { return user3p()->castInt(); } int user3() const { return user3p()->castInt(); }
void user3(int val) { user3p(AstNUser::fromInt(val)); } void user3(int val) { user3p(AstNUser::fromInt(val)); }
int user3Inc() { int v=user3(); user3(v+1); return v; } int user3Inc(int val=1) { int v=user3(); user3(v+val); return v; }
int user3SetOnce() { int v=user3(); if (!v) user3(1); return v; } int user3SetOnce() { int v=user3(); if (!v) user3(1); return v; }
static void user3ClearTree() { AstUser3InUse::clear(); } static void user3ClearTree() { AstUser3InUse::clear(); }
@@ -1125,7 +1149,7 @@ public:
void user4p(void* userp) { m_user4p=(AstNUser*)(userp); m_user4Cnt=AstUser4InUse::s_userCntGbl; } void user4p(void* userp) { m_user4p=(AstNUser*)(userp); m_user4Cnt=AstUser4InUse::s_userCntGbl; }
int user4() const { return user4p()->castInt(); } int user4() const { return user4p()->castInt(); }
void user4(int val) { user4p(AstNUser::fromInt(val)); } void user4(int val) { user4p(AstNUser::fromInt(val)); }
int user4Inc() { int v=user4(); user4(v+1); return v; } int user4Inc(int val=1) { int v=user4(); user4(v+val); return v; }
int user4SetOnce() { int v=user4(); if (!v) user4(1); return v; } int user4SetOnce() { int v=user4(); if (!v) user4(1); return v; }
static void user4ClearTree() { AstUser4InUse::clear(); } static void user4ClearTree() { AstUser4InUse::clear(); }
@@ -1135,7 +1159,7 @@ public:
void user5p(void* userp) { m_user5p=(AstNUser*)(userp); m_user5Cnt=AstUser5InUse::s_userCntGbl; } void user5p(void* userp) { m_user5p=(AstNUser*)(userp); m_user5Cnt=AstUser5InUse::s_userCntGbl; }
int user5() const { return user5p()->castInt(); } int user5() const { return user5p()->castInt(); }
void user5(int val) { user5p(AstNUser::fromInt(val)); } void user5(int val) { user5p(AstNUser::fromInt(val)); }
int user5Inc() { int v=user5(); user5(v+1); return v; } int user5Inc(int val=1) { int v=user5(); user5(v+val); return v; }
int user5SetOnce() { int v=user5(); if (!v) user5(1); return v; } int user5SetOnce() { int v=user5(); if (!v) user5(1); return v; }
static void user5ClearTree() { AstUser5InUse::clear(); } static void user5ClearTree() { AstUser5InUse::clear(); }
@@ -1189,8 +1213,10 @@ public:
void dumpGdbHeader() const; void dumpGdbHeader() const;
// METHODS - Tree modifications // METHODS - Tree modifications
AstNode* addNext(AstNode* newp); // Returns this, adds to end of list static AstNode* addNext(AstNode* nodep, AstNode* newp); // Returns nodep, adds newp to end of nodep's list
AstNode* addNextNull(AstNode* newp); // Returns this, adds to end of list, NULL is OK static AstNode* addNextNull(AstNode* nodep, AstNode* newp); // Returns nodep, adds newp (maybe NULL) to end of nodep's list
inline AstNode* addNext(AstNode* newp) { return addNext(this, newp); }
inline AstNode* addNextNull(AstNode* newp) { return addNextNull(this, newp); }
void addNextHere(AstNode* newp); // Adds after speced node void addNextHere(AstNode* newp); // Adds after speced node
void addPrev(AstNode* newp) { replaceWith(newp); newp->addNext(this); } void addPrev(AstNode* newp) { replaceWith(newp); newp->addNext(this); }
void addHereThisAsNext(AstNode* newp); // Adds at old place of this, this becomes next void addHereThisAsNext(AstNode* newp); // Adds at old place of this, this becomes next
@@ -1206,6 +1232,7 @@ public:
// METHODS - Iterate on a tree // METHODS - Iterate on a tree
AstNode* cloneTree(bool cloneNextLink); AstNode* cloneTree(bool cloneNextLink);
bool gateTree() { return gateTreeIter(); } // Is tree gateOptimizable?
bool sameTree(AstNode* node2p); // Does tree of this == node2p? bool sameTree(AstNode* node2p); // Does tree of this == node2p?
bool sameGateTree(AstNode* node2p); // Does tree of this == node2p?, not allowing non-isGateOptimizable bool sameGateTree(AstNode* node2p); // Does tree of this == node2p?, not allowing non-isGateOptimizable
void deleteTree(); // Always deletes the next link void deleteTree(); // Always deletes the next link
@@ -1242,7 +1269,6 @@ public:
void iterate(AstNVisitor& v, AstNUser* vup=NULL) { this->accept(v,vup); } // Does this; excludes following this->next void iterate(AstNVisitor& v, AstNUser* vup=NULL) { this->accept(v,vup); } // Does this; excludes following this->next
void iterateAndNext(AstNVisitor& v, AstNUser* vup=NULL); void iterateAndNext(AstNVisitor& v, AstNUser* vup=NULL);
void iterateAndNextConst(AstNVisitor& v, AstNUser* vup=NULL); void iterateAndNextConst(AstNVisitor& v, AstNUser* vup=NULL);
void iterateAndNextIgnoreEdit(AstNVisitor& v, AstNUser* vup=NULL) { iterateAndNextConst(v, vup); }
void iterateChildren(AstNVisitor& v, AstNUser* vup=NULL); // Excludes following this->next void iterateChildren(AstNVisitor& v, AstNUser* vup=NULL); // Excludes following this->next
void iterateChildrenBackwards(AstNVisitor& v, AstNUser* vup=NULL); // Excludes following this->next void iterateChildrenBackwards(AstNVisitor& v, AstNUser* vup=NULL); // Excludes following this->next
void iterateChildrenConst(AstNVisitor& v, AstNUser* vup=NULL); // Excludes following this->next void iterateChildrenConst(AstNVisitor& v, AstNUser* vup=NULL); // Excludes following this->next
@@ -1269,7 +1295,7 @@ inline void AstNRelinker::relink(AstNode* newp) { newp->AstNode::relink(this); }
class AstNodeMath : public AstNode { class AstNodeMath : public AstNode {
// Math -- anything that's part of an expression tree // Math -- anything that's part of an expression tree
public: public:
AstNodeMath(FileLine* fl) explicit AstNodeMath(FileLine* fl)
: AstNode(fl) {} : AstNode(fl) {}
ASTNODE_BASE_FUNCS(NodeMath) ASTNODE_BASE_FUNCS(NodeMath)
// METHODS // METHODS
@@ -1286,7 +1312,7 @@ public:
class AstNodeTermop : public AstNodeMath { class AstNodeTermop : public AstNodeMath {
// Terminal operator -- a operator with no "inputs" // Terminal operator -- a operator with no "inputs"
public: public:
AstNodeTermop(FileLine* fl) explicit AstNodeTermop(FileLine* fl)
: AstNodeMath(fl) {} : AstNodeMath(fl) {}
ASTNODE_BASE_FUNCS(NodeTermop) ASTNODE_BASE_FUNCS(NodeTermop)
// Know no children, and hot function, so skip iterator for speed // Know no children, and hot function, so skip iterator for speed
@@ -1324,6 +1350,8 @@ public:
: AstNodeMath(fl) { : AstNodeMath(fl) {
setOp1p(lhs); setOp2p(rhs); } setOp1p(lhs); setOp2p(rhs); }
ASTNODE_BASE_FUNCS(NodeBiop) ASTNODE_BASE_FUNCS(NodeBiop)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp)=0; // Clone single node, just get same type back.
// ACCESSORS
AstNode* lhsp() const { return op1p()->castNode(); } AstNode* lhsp() const { return op1p()->castNode(); }
AstNode* rhsp() const { return op2p()->castNode(); } AstNode* rhsp() const { return op2p()->castNode(); }
void lhsp(AstNode* nodep) { return setOp1p(nodep); } void lhsp(AstNode* nodep) { return setOp1p(nodep); }
@@ -1430,7 +1458,7 @@ public:
class AstNodeStmt : public AstNode { class AstNodeStmt : public AstNode {
// Statement -- anything that's directly under a function // Statement -- anything that's directly under a function
public: public:
AstNodeStmt(FileLine* fl) explicit AstNodeStmt(FileLine* fl)
: AstNode(fl) {} : AstNode(fl) {}
ASTNODE_BASE_FUNCS(NodeStmt) ASTNODE_BASE_FUNCS(NodeStmt)
// METHODS // METHODS
@@ -1520,7 +1548,7 @@ public:
class AstNodeSenItem : public AstNode { class AstNodeSenItem : public AstNode {
// An AstSenItem or AstSenGate // An AstSenItem or AstSenGate
public: public:
AstNodeSenItem(FileLine* fl) : AstNode(fl) {} explicit AstNodeSenItem(FileLine* fl) : AstNode(fl) {}
ASTNODE_BASE_FUNCS(NodeSenItem) ASTNODE_BASE_FUNCS(NodeSenItem)
virtual bool isClocked() const = 0; virtual bool isClocked() const = 0;
virtual bool isCombo() const = 0; virtual bool isCombo() const = 0;
@@ -1607,7 +1635,7 @@ private:
static int s_uniqueNum; // Unique number assigned to each dtype during creation for IEEE matching static int s_uniqueNum; // Unique number assigned to each dtype during creation for IEEE matching
public: public:
// CONSTRUCTORS // CONSTRUCTORS
AstNodeDType(FileLine* fl) : AstNode(fl) { explicit AstNodeDType(FileLine* fl) : AstNode(fl) {
m_width=0; m_widthMin=0; m_generic=false; m_width=0; m_widthMin=0; m_generic=false;
} }
ASTNODE_BASE_FUNCS(NodeDType) ASTNODE_BASE_FUNCS(NodeDType)
@@ -1696,7 +1724,7 @@ private:
AstNodeDType* m_refDTypep; // Elements of this type (after widthing) AstNodeDType* m_refDTypep; // Elements of this type (after widthing)
AstNode* rangenp() const { return op2p(); } // op2 = Array(s) of variable AstNode* rangenp() const { return op2p(); } // op2 = Array(s) of variable
public: public:
AstNodeArrayDType(FileLine* fl) : AstNodeDType(fl) { explicit AstNodeArrayDType(FileLine* fl) : AstNodeDType(fl) {
m_refDTypep = NULL; m_refDTypep = NULL;
} }
ASTNODE_BASE_FUNCS(NodeArrayDType) ASTNODE_BASE_FUNCS(NodeArrayDType)
@@ -1789,6 +1817,7 @@ public:
virtual void dump(ostream& str=cout); virtual void dump(ostream& str=cout);
virtual string name() const { return m_name; } // * = Var name virtual string name() const { return m_name; } // * = Var name
virtual bool maybePointedTo() const { return true; } virtual bool maybePointedTo() const { return true; }
virtual bool isGateOptimizable() const { return !((m_dpiExport || m_dpiImport) && !m_pure); }
// {AstFunc only} op1 = Range output variable // {AstFunc only} op1 = Range output variable
virtual void name(const string& name) { m_name = name; } virtual void name(const string& name) { m_name = name; }
string cname() const { return m_cname; } string cname() const { return m_cname; }
@@ -1847,6 +1876,7 @@ public:
}} }}
virtual void dump(ostream& str=cout); virtual void dump(ostream& str=cout);
virtual string name() const { return m_name; } // * = Var name virtual string name() const { return m_name; } // * = Var name
virtual bool isGateOptimizable() const { return m_taskp && m_taskp->isGateOptimizable(); }
string dotted() const { return m_dotted; } // * = Scope name or "" string dotted() const { return m_dotted; } // * = Scope name or ""
string prettyDotted() const { return prettyName(dotted()); } string prettyDotted() const { return prettyName(dotted()); }
string inlinedDots() const { return m_inlinedDots; } string inlinedDots() const { return m_inlinedDots; }
@@ -1942,8 +1972,8 @@ inline bool AstNode::isNeqZero() { return (this->castConst() && this->castConst
inline bool AstNode::isOne() { return (this->castConst() && this->castConst()->num().isEqOne()); } inline bool AstNode::isOne() { return (this->castConst() && this->castConst()->num().isEqOne()); }
inline bool AstNode::isAllOnes() { return (this->castConst() && this->castConst()->isEqAllOnes()); } inline bool AstNode::isAllOnes() { return (this->castConst() && this->castConst()->isEqAllOnes()); }
inline bool AstNode::isAllOnesV() { return (this->castConst() && this->castConst()->isEqAllOnesV()); } inline bool AstNode::isAllOnesV() { return (this->castConst() && this->castConst()->isEqAllOnesV()); }
inline bool AstNode::sameTree(AstNode* node2p) { return sameTreeIter(node2p, true, false); } inline bool AstNode::sameTree(AstNode* node2p) { return sameTreeIter(this, node2p, true, false); }
inline bool AstNode::sameGateTree(AstNode* node2p) { return sameTreeIter(node2p, true, true); } inline bool AstNode::sameGateTree(AstNode* node2p) { return sameTreeIter(this, node2p, true, true); }
inline void AstNodeVarRef::init() { if (m_varp) dtypep(m_varp->dtypep()); } inline void AstNodeVarRef::init() { if (m_varp) dtypep(m_varp->dtypep()); }
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+9 -23
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -386,6 +386,7 @@ AstNodeDType* AstNodeDType::dtypeDimensionp(int dimension) {
// TODO this function should be removed in favor of recursing the dtype(), // TODO this function should be removed in favor of recursing the dtype(),
// as that allows for more complicated data types. // as that allows for more complicated data types.
int dim = 0; int dim = 0;
UDEBUGONLY(UASSERT(dynamic_cast<AstNode*>(this),"this should not be NULL"););
for (AstNodeDType* dtypep=this; dtypep; ) { for (AstNodeDType* dtypep=this; dtypep; ) {
dtypep = dtypep->skipRefp(); // Skip AstRefDType/AstTypedef, or return same node dtypep = dtypep->skipRefp(); // Skip AstRefDType/AstTypedef, or return same node
if (AstNodeArrayDType* adtypep = dtypep->castNodeArrayDType()) { if (AstNodeArrayDType* adtypep = dtypep->castNodeArrayDType()) {
@@ -420,6 +421,7 @@ AstNodeDType* AstNodeDType::dtypeDimensionp(int dimension) {
uint32_t AstNodeDType::arrayUnpackedElements() { uint32_t AstNodeDType::arrayUnpackedElements() {
uint32_t entries=1; uint32_t entries=1;
UDEBUGONLY(UASSERT(dynamic_cast<AstNode*>(this),"this should not be NULL"););
for (AstNodeDType* dtypep=this; dtypep; ) { for (AstNodeDType* dtypep=this; dtypep; ) {
dtypep = dtypep->skipRefp(); // Skip AstRefDType/AstTypedef, or return same node dtypep = dtypep->skipRefp(); // Skip AstRefDType/AstTypedef, or return same node
if (AstUnpackArrayDType* adtypep = dtypep->castUnpackArrayDType()) { if (AstUnpackArrayDType* adtypep = dtypep->castUnpackArrayDType()) {
@@ -438,6 +440,7 @@ pair<uint32_t,uint32_t> AstNodeDType::dimensions(bool includeBasic) {
// How many array dimensions (packed,unpacked) does this Var have? // How many array dimensions (packed,unpacked) does this Var have?
uint32_t packed = 0; uint32_t packed = 0;
uint32_t unpacked = 0; uint32_t unpacked = 0;
UDEBUGONLY(UASSERT(dynamic_cast<AstNode*>(this),"this should not be NULL"););
for (AstNodeDType* dtypep=this; dtypep; ) { for (AstNodeDType* dtypep=this; dtypep; ) {
dtypep = dtypep->skipRefp(); // Skip AstRefDType/AstTypedef, or return same node dtypep = dtypep->skipRefp(); // Skip AstRefDType/AstTypedef, or return same node
if (AstNodeArrayDType* adtypep = dtypep->castNodeArrayDType()) { if (AstNodeArrayDType* adtypep = dtypep->castNodeArrayDType()) {
@@ -506,9 +509,9 @@ string AstScope::nameDotless() const {
return out; return out;
} }
string AstScopeName::scopePrettyName() const { string AstScopeName::scopePrettyNameFormatter(AstText* scopeTextp) const {
string out; string out;
for (AstText* textp=scopeAttrp(); textp; textp=textp->nextp()->castText()) { for (AstText* textp=scopeTextp; textp; textp=textp->nextp()->castText()) {
out += textp->text(); out += textp->text();
} }
// TOP will be replaced by top->name() // TOP will be replaced by top->name()
@@ -518,27 +521,9 @@ string AstScopeName::scopePrettyName() const {
return AstNode::prettyName(out); return AstNode::prettyName(out);
} }
string AstScopeName::scopeSymName() const { string AstScopeName::scopeNameFormatter(AstText* scopeTextp) const {
string out; string out;
for (AstText* textp=scopeAttrp(); textp; textp=textp->nextp()->castText()) { for (AstText* textp=scopeTextp; textp; textp=textp->nextp()->castText()) {
out += textp->text();
}
if (out.substr(0,10) == "__DOT__TOP") out.replace(0,10,"");
if (out.substr(0,7) == "__DOT__") out.replace(0,7,"");
if (out.substr(0,1) == ".") out.replace(0,1,"");
string::size_type pos;
while ((pos=out.find(".")) != string::npos) {
out.replace(pos, 1, "__");
}
while ((pos=out.find("__DOT__")) != string::npos) {
out.replace(pos, 7, "__");
}
return out;
}
string AstScopeName::scopeDpiName() const {
string out;
for (AstText* textp=scopeEntrp(); textp; textp=textp->nextp()->castText()) {
out += textp->text(); out += textp->text();
} }
if (out.substr(0,10) == "__DOT__TOP") out.replace(0,10,""); if (out.substr(0,10) == "__DOT__TOP") out.replace(0,10,"");
@@ -992,6 +977,7 @@ void AstVar::dump(ostream& str) {
if (attrFileDescr()) str<<" [aFD]"; if (attrFileDescr()) str<<" [aFD]";
if (isFuncReturn()) str<<" [FUNCRTN]"; if (isFuncReturn()) str<<" [FUNCRTN]";
else if (isFuncLocal()) str<<" [FUNC]"; else if (isFuncLocal()) str<<" [FUNC]";
if (!attrClocker().unknown()) str<<" ["<<attrClocker().ascii()<<"] ";
str<<" "<<varType(); str<<" "<<varType();
} }
void AstSenTree::dump(ostream& str) { void AstSenTree::dump(ostream& str) {
+233 -20
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -158,6 +158,39 @@ public:
//###################################################################### //######################################################################
//==== Data Types //==== Data Types
class AstParamTypeDType : public AstNodeDType {
// Parents: MODULE
// A parameter type statement; much like a var or typedef
private:
AstVarType m_varType; // Type of variable (for localparam vs. param)
string m_name; // Name of variable
public:
AstParamTypeDType(FileLine* fl, AstVarType type, const string& name, VFlagChildDType, AstNodeDType* dtp)
: AstNodeDType(fl), m_varType(type), m_name(name) {
childDTypep(dtp); // Only for parser
dtypep(NULL); // V3Width will resolve
}
ASTNODE_NODE_FUNCS(ParamTypeDType, PARAMTYPEDTYPE)
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(); }
virtual AstBasicDType* basicp() const { return subDTypep()->basicp(); } // (Slow) recurse down to find basic data type
virtual AstNodeDType* skipRefp() const { return subDTypep()->skipRefp(); }
virtual AstNodeDType* skipRefToConstp() const { return subDTypep()->skipRefToConstp(); }
virtual AstNodeDType* skipRefToEnump() const { return subDTypep()->skipRefToEnump(); }
virtual int widthAlignBytes() const { return dtypep()->widthAlignBytes(); }
virtual int widthTotalBytes() const { return dtypep()->widthTotalBytes(); }
// METHODS
virtual string name() const { return m_name; }
virtual bool maybePointedTo() const { return true; }
virtual bool hasDType() const { return true; }
void name(const string& flag) { m_name = flag; }
AstVarType varType() const { return m_varType; } // * = Type of variable
bool isParam() const { return true; }
bool isGParam() const { return (varType()==AstVarType::GPARAM); }
};
class AstTypedef : public AstNode { class AstTypedef : public AstNode {
private: private:
string m_name; string m_name;
@@ -689,6 +722,24 @@ public:
virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); } virtual int widthTotalBytes() const { return subDTypep()->widthTotalBytes(); }
}; };
class AstParseTypeDType : public AstNodeDType {
// Parents: VAR
// During parsing, this indicates the type of a parameter is a "parameter type"
// e.g. the data type is a container of any data type
public:
AstParseTypeDType(FileLine* fl)
: AstNodeDType(fl) {}
ASTNODE_NODE_FUNCS(ParseTypeDType, PARSETYPEDTYPE)
AstNodeDType* dtypep() const { return NULL; }
// METHODS
virtual AstBasicDType* basicp() const { return NULL; }
virtual AstNodeDType* skipRefp() const { return NULL; }
virtual AstNodeDType* skipRefToConstp() const { return (AstNodeDType*)this; }
virtual AstNodeDType* skipRefToEnump() const { return (AstNodeDType*)this; }
virtual int widthAlignBytes() const { return 0; }
virtual int widthTotalBytes() const { return 0; }
};
//###################################################################### //######################################################################
class AstArraySel : public AstNodeSel { class AstArraySel : public AstNodeSel {
@@ -713,6 +764,7 @@ public:
init(fromp); init(fromp);
} }
ASTNODE_NODE_FUNCS(ArraySel, ARRAYSEL) ASTNODE_NODE_FUNCS(ArraySel, ARRAYSEL)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstArraySel(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) {
V3ERROR_NA; /* How can from be a const? */ } V3ERROR_NA; /* How can from be a const? */ }
virtual string emitVerilog() { return "%k(%l%f[%r])"; } virtual string emitVerilog() { return "%k(%l%f[%r])"; }
@@ -742,6 +794,7 @@ public:
dtypeSetUInt32(); // Always used on IData arrays so returns word entities dtypeSetUInt32(); // Always used on IData arrays so returns word entities
} }
ASTNODE_NODE_FUNCS(WordSel, WORDSEL) ASTNODE_NODE_FUNCS(WordSel, WORDSEL)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstWordSel(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& from, const V3Number& bit) { V3ERROR_NA; } virtual void numberOperate(V3Number& out, const V3Number& from, const V3Number& bit) { V3ERROR_NA; }
virtual string emitVerilog() { return "%k(%l%f[%r])"; } virtual string emitVerilog() { return "%k(%l%f[%r])"; }
virtual string emitC() { return "%li[%ri]"; } // Not %k, as usually it's a small constant rhsp virtual string emitC() { return "%li[%ri]"; } // Not %k, as usually it's a small constant rhsp
@@ -1311,6 +1364,7 @@ public:
ASTNODE_NODE_FUNCS(VarXRef, VARXREF) ASTNODE_NODE_FUNCS(VarXRef, VARXREF)
virtual void dump(ostream& str); virtual void dump(ostream& str);
string dotted() const { return m_dotted; } string dotted() const { return m_dotted; }
void dotted(const string& dotted) { m_dotted = dotted; }
string prettyDotted() const { return prettyName(dotted()); } string prettyDotted() const { return prettyName(dotted()); }
string inlinedDots() const { return m_inlinedDots; } string inlinedDots() const { return m_inlinedDots; }
void inlinedDots(const string& flag) { m_inlinedDots = flag; } void inlinedDots(const string& flag) { m_inlinedDots = flag; }
@@ -1332,6 +1386,7 @@ 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.
AstParamTypeDType* m_modPTypep; // Param type this pin connects to on submodule.
bool m_param; // Pin connects to parameter 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:
@@ -1340,6 +1395,7 @@ public:
,m_name(name), m_param(false), m_svImplicit(false) { ,m_name(name), m_param(false), m_svImplicit(false) {
m_pinNum = pinNum; m_pinNum = pinNum;
m_modVarp = NULL; m_modVarp = NULL;
m_modPTypep = NULL;
setNOp1p(exprp); setNOp1p(exprp);
} }
AstPin(FileLine* fl, int pinNum, AstVarRef* varname, AstNode* exprp) AstPin(FileLine* fl, int pinNum, AstVarRef* varname, AstNode* exprp)
@@ -1347,11 +1403,15 @@ public:
m_name = varname->name(); m_name = varname->name();
m_pinNum = pinNum; m_pinNum = pinNum;
m_modVarp = NULL; m_modVarp = NULL;
m_modPTypep = NULL;
setNOp1p(exprp); setNOp1p(exprp);
} }
ASTNODE_NODE_FUNCS(Pin, PIN) ASTNODE_NODE_FUNCS(Pin, PIN)
virtual void dump(ostream& str); virtual void dump(ostream& str);
virtual const char* broken() const { BROKEN_RTN(m_modVarp && !m_modVarp->brokeExists()); return NULL; } virtual const char* broken() const {
BROKEN_RTN(m_modVarp && !m_modVarp->brokeExists());
BROKEN_RTN(m_modPTypep && !m_modPTypep->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; }
virtual string prettyOperatorName() const { return modVarp() virtual string prettyOperatorName() const { return modVarp()
@@ -1362,7 +1422,9 @@ public:
void exprp(AstNode* nodep) { addOp1p(nodep); } void exprp(AstNode* nodep) { addOp1p(nodep); }
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* nodep) { m_modVarp=nodep; }
AstParamTypeDType* modPTypep() const { return m_modPTypep; } // [After Link] Pointer to variable
void modPTypep(AstParamTypeDType* nodep) { m_modPTypep=nodep; }
bool param() const { return m_param; } bool param() const { return m_param; }
void param(bool flag) { m_param=flag; } void param(bool flag) { m_param=flag; }
bool svImplicit() const { return m_svImplicit; } bool svImplicit() const { return m_svImplicit; }
@@ -1570,6 +1632,56 @@ public:
virtual void name(const string& name) { m_name = name; } virtual void name(const string& name) { m_name = name; }
}; };
class AstCellRef : public AstNode {
// As-of-yet unlinkable reference into a cell
private:
string m_name; // Cell name
public:
AstCellRef(FileLine* fl,
string name, AstNode* cellp, AstNode* exprp)
: AstNode(fl)
, m_name(name) {
addNOp1p(cellp); addNOp2p(exprp); }
ASTNODE_NODE_FUNCS(CellRef, CELLREF)
// ACCESSORS
virtual string name() const { return m_name; } // * = Array name
AstNode* cellp() const { return op1p(); } // op1 = Cell
AstNode* exprp() const { return op2p(); } // op2 = Expression
};
class AstCellArrayRef : public AstNode {
// As-of-yet unlinkable reference into an array of cells
private:
string m_name; // Array name
public:
AstCellArrayRef(FileLine* fl,
string name, AstNode* selectExprp)
: AstNode(fl)
, m_name(name) {
addNOp1p(selectExprp); }
ASTNODE_NODE_FUNCS(CellArrayRef, CELLARRAYREF)
// ACCESSORS
virtual string name() const { return m_name; } // * = Array name
AstNode* selp() const { return op1p(); } // op1 = Select expression
};
class AstUnlinkedRef : public AstNode {
// As-of-yet unlinkable Ref
private:
string m_name; // Var name
public:
AstUnlinkedRef(FileLine* fl,
AstNode* refp, string name, AstNode* crp)
: AstNode(fl)
, m_name(name) {
addNOp1p(refp); addNOp2p(crp); }
ASTNODE_NODE_FUNCS(UnlinkedRef, UNLINKEDREF)
// ACCESSORS
virtual string name() const { return m_name; } // * = Var name
AstNode* refp() const { return op1p(); } // op1 = VarXRef or AstNodeFTaskRef
AstNode* cellrefp() const { return op2p(); } // op2 = CellArrayRef or CellRef
};
class AstBind : public AstNode { class AstBind : public AstNode {
// Parents: MODULE // Parents: MODULE
// Children: CELL // Children: CELL
@@ -2208,11 +2320,13 @@ class AstSFormatF : public AstNode {
public: public:
AstSFormatF(FileLine* fl, const string& text, bool hidden, AstNode* exprsp) AstSFormatF(FileLine* fl, const string& text, bool hidden, AstNode* exprsp)
: AstNode(fl), m_text(text), m_hidden(hidden) { : AstNode(fl), m_text(text), m_hidden(hidden) {
dtypeSetString();
addNOp1p(exprsp); addNOp2p(NULL); } addNOp1p(exprsp); addNOp2p(NULL); }
ASTNODE_NODE_FUNCS(SFormatF, SFORMATF) ASTNODE_NODE_FUNCS(SFormatF, SFORMATF)
virtual string name() const { return m_text; } virtual string name() const { return m_text; }
virtual int instrCount() const { return instrCountPli(); } virtual int instrCount() const { return instrCountPli(); }
virtual V3Hash sameHash() const { return V3Hash(text()); } virtual V3Hash sameHash() const { return V3Hash(text()); }
virtual bool hasDType() const { return true; }
virtual bool same(AstNode* samep) const { return text()==samep->castSFormatF()->text(); } virtual bool same(AstNode* samep) const { return text()==samep->castSFormatF()->text(); }
virtual string verilogKwd() const { return "$sformatf"; } virtual string verilogKwd() const { return "$sformatf"; }
void exprsp(AstNode* nodep) { addOp1p(nodep); } // op1 = Expressions to output void exprsp(AstNode* nodep) { addOp1p(nodep); } // op1 = Expressions to output
@@ -2602,7 +2716,7 @@ public:
class AstBreak : public AstNodeStmt { class AstBreak : public AstNodeStmt {
public: public:
AstBreak(FileLine* fileline) explicit AstBreak(FileLine* fileline)
: AstNodeStmt (fileline) {} : AstNodeStmt (fileline) {}
ASTNODE_NODE_FUNCS(Break, BREAK) ASTNODE_NODE_FUNCS(Break, BREAK)
virtual string verilogKwd() const { return "break"; }; virtual string verilogKwd() const { return "break"; };
@@ -2612,7 +2726,7 @@ public:
class AstContinue : public AstNodeStmt { class AstContinue : public AstNodeStmt {
public: public:
AstContinue(FileLine* fileline) explicit AstContinue(FileLine* fileline)
: AstNodeStmt (fileline) {} : AstNodeStmt (fileline) {}
ASTNODE_NODE_FUNCS(Continue, CONTINUE) ASTNODE_NODE_FUNCS(Continue, CONTINUE)
virtual string verilogKwd() const { return "continue"; }; virtual string verilogKwd() const { return "continue"; };
@@ -2751,6 +2865,7 @@ public:
dtypeSetUInt32(); // Always used on, and returns word entities dtypeSetUInt32(); // Always used on, and returns word entities
} }
ASTNODE_NODE_FUNCS(ChangeXor, CHANGEXOR) ASTNODE_NODE_FUNCS(ChangeXor, CHANGEXOR)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstChangeXor(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opChangeXor(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opChangeXor(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f^ %r)"; } virtual string emitVerilog() { return "%k(%l %f^ %r)"; }
virtual string emitC() { return "VL_CHANGEXOR_%li(%lw, %P, %li, %ri)"; } virtual string emitC() { return "VL_CHANGEXOR_%li(%lw, %P, %li, %ri)"; }
@@ -2869,20 +2984,37 @@ class AstInitArray : public AstNode {
// Set a var to a large list of values // Set a var to a large list of values
// The values must be in sorted order, and not exceed the size of the var's array. // The values must be in sorted order, and not exceed the size of the var's array.
// The first value on the initsp() list is for the lo() index of the array. // The first value on the initsp() list is for the lo() index of the array.
// If default is specified, the vector may be sparse, and not provide each value.
// Parents: ASTVAR::init() // Parents: ASTVAR::init()
// Children: CONSTs... // Children: CONSTs...
deque<uint32_t> m_indices; // Which array index each entry in the list is for (if defaultp)
public: public:
AstInitArray(FileLine* fl, AstNodeArrayDType* newDTypep, AstNode* initsp) AstInitArray(FileLine* fl, AstNodeArrayDType* newDTypep, AstNode* defaultp)
: AstNode(fl) { : AstNode(fl) {
dtypep(newDTypep); dtypep(newDTypep);
addNOp1p(initsp); addNOp1p(defaultp);
} }
ASTNODE_NODE_FUNCS(InitArray, INITARRAY) ASTNODE_NODE_FUNCS(InitArray, INITARRAY)
AstNode* initsp() const { return op1p()->castNode(); } // op1 = Initial value expressions AstNode* defaultp() const { return op1p()->castNode(); } // op1 = Default if sparse
void addInitsp(AstNode* newp) { addOp1p(newp); } void defaultp(AstNode* newp) { setOp1p(newp); }
AstNode* initsp() const { return op2p()->castNode(); } // op2 = Initial value expressions
void addValuep(AstNode* newp) { addIndexValuep(m_indices.size(), newp); }
void addIndexValuep(uint32_t index, AstNode* newp) {
// Must insert in sorted order
if (!m_indices.empty()) UASSERT(index > m_indices.back(), "InitArray adding index <= previous index");
m_indices.push_back(index);
addOp2p(newp); }
void addFrontValuep(AstNode* newp) { // Add to front of list, e.g. index 0.
// e.g. 0:100, 1:101 when addFront(200), get 0:200, 1:100, 2:101
initsp()->addHereThisAsNext(newp);
m_indices.push_back(m_indices.size());
}
int posIndex(int listPos) {
UASSERT (listPos < (int)m_indices.size(), "InitArray past end of indices list");
return m_indices[listPos]; }
virtual bool hasDType() const { return true; } virtual bool hasDType() const { return true; }
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 m_indices==samep->castInitArray()->m_indices; }
}; };
class AstPragma : public AstNode { class AstPragma : public AstNode {
@@ -2905,7 +3037,7 @@ public:
class AstStop : public AstNodeStmt { class AstStop : public AstNodeStmt {
public: public:
AstStop(FileLine* fl) explicit AstStop(FileLine* fl)
: AstNodeStmt(fl) {} : AstNodeStmt(fl) {}
ASTNODE_NODE_FUNCS(Stop, STOP) ASTNODE_NODE_FUNCS(Stop, STOP)
virtual bool isGateOptimizable() const { return false; } virtual bool isGateOptimizable() const { return false; }
@@ -2921,7 +3053,7 @@ public:
class AstFinish : public AstNodeStmt { class AstFinish : public AstNodeStmt {
public: public:
AstFinish(FileLine* fl) explicit AstFinish(FileLine* fl)
: AstNodeStmt(fl) {} : AstNodeStmt(fl) {}
ASTNODE_NODE_FUNCS(Finish, FINISH) ASTNODE_NODE_FUNCS(Finish, FINISH)
virtual bool isGateOptimizable() const { return false; } virtual bool isGateOptimizable() const { return false; }
@@ -3067,8 +3199,10 @@ class AstScopeName : public AstNodeMath {
// Children: TEXT // Children: TEXT
private: private:
bool m_dpiExport; // Is for dpiExport bool m_dpiExport; // Is for dpiExport
string scopeNameFormatter(AstText* textp) const;
string scopePrettyNameFormatter(AstText* textp) const;
public: public:
AstScopeName(FileLine* fl) : AstNodeMath(fl), m_dpiExport(false) { explicit AstScopeName(FileLine* fl) : AstNodeMath(fl), m_dpiExport(false) {
dtypeSetUInt64(); } dtypeSetUInt64(); }
ASTNODE_NODE_FUNCS(ScopeName, SCOPENAME) ASTNODE_NODE_FUNCS(ScopeName, SCOPENAME)
virtual V3Hash sameHash() const { return V3Hash(); } virtual V3Hash sameHash() const { return V3Hash(); }
@@ -3080,9 +3214,10 @@ public:
void scopeAttrp(AstNode* nodep) { addOp1p(nodep); } void scopeAttrp(AstNode* nodep) { addOp1p(nodep); }
AstText* scopeEntrp() const { return op2p()->castText(); } AstText* scopeEntrp() const { return op2p()->castText(); }
void scopeEntrp(AstNode* nodep) { addOp2p(nodep); } void scopeEntrp(AstNode* nodep) { addOp2p(nodep); }
string scopeSymName() const; // Name for __Vscope variable including children string scopeSymName() const { return scopeNameFormatter(scopeAttrp()); } // Name for __Vscope variable including children
string scopeDpiName() const; // Name for DPI import scope string scopeDpiName() const { return scopeNameFormatter(scopeEntrp()); } // Name for DPI import scope
string scopePrettyName() const; // Name for __Vscope printing string scopePrettySymName() const { return scopePrettyNameFormatter(scopeAttrp()); } // Name for __Vscope variable including children
string scopePrettyDpiName() const { return scopePrettyNameFormatter(scopeEntrp()); } // Name for __Vscope variable including children
bool dpiExport() const { return m_dpiExport; } bool dpiExport() const { return m_dpiExport; }
void dpiExport(bool flag) { m_dpiExport=flag; } void dpiExport(bool flag) { m_dpiExport=flag; }
}; };
@@ -3117,7 +3252,7 @@ private:
public: public:
AstRand(FileLine* fl, AstNodeDType* dtp, bool reset) : AstNodeTermop(fl) { AstRand(FileLine* fl, AstNodeDType* dtp, bool reset) : AstNodeTermop(fl) {
dtypep(dtp); m_reset=reset; } dtypep(dtp); m_reset=reset; }
AstRand(FileLine* fl) : AstNodeTermop(fl), m_reset(false) { } explicit AstRand(FileLine* fl) : AstNodeTermop(fl), m_reset(false) { }
ASTNODE_NODE_FUNCS(Rand, RAND) ASTNODE_NODE_FUNCS(Rand, RAND)
virtual string emitVerilog() { return "%f$random"; } virtual string emitVerilog() { return "%f$random"; }
virtual string emitC() { virtual string emitC() {
@@ -3134,7 +3269,7 @@ public:
class AstTime : public AstNodeTermop { class AstTime : public AstNodeTermop {
public: public:
AstTime(FileLine* fl) : AstNodeTermop(fl) { explicit AstTime(FileLine* fl) : AstNodeTermop(fl) {
dtypeSetUInt64(); } dtypeSetUInt64(); }
ASTNODE_NODE_FUNCS(Time, TIME) ASTNODE_NODE_FUNCS(Time, TIME)
virtual string emitVerilog() { return "%f$time"; } virtual string emitVerilog() { return "%f$time"; }
@@ -3149,7 +3284,7 @@ public:
class AstTimeD : public AstNodeTermop { class AstTimeD : public AstNodeTermop {
public: public:
AstTimeD(FileLine* fl) : AstNodeTermop(fl) { explicit AstTimeD(FileLine* fl) : AstNodeTermop(fl) {
dtypeSetDouble(); } dtypeSetDouble(); }
ASTNODE_NODE_FUNCS(TimeD, TIMED) ASTNODE_NODE_FUNCS(TimeD, TIMED)
virtual string emitVerilog() { return "%f$realtime"; } virtual string emitVerilog() { return "%f$realtime"; }
@@ -3511,6 +3646,7 @@ public:
setOp1p(lhsp); setOp2p(rhsp); setOp1p(lhsp); setOp2p(rhsp);
} }
ASTNODE_NODE_FUNCS(CastSize, CASTSIZE) ASTNODE_NODE_FUNCS(CastSize, CASTSIZE)
// No hasDType because widthing removes this node before the hasDType check
virtual string emitVerilog() { return "((%r)'(%l))"; } virtual string emitVerilog() { return "((%r)'(%l))"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
virtual bool cleanOut() { V3ERROR_NA; return true;} virtual bool cleanLhs() {return true;} virtual bool cleanOut() { V3ERROR_NA; return true;} virtual bool cleanLhs() {return true;}
@@ -3690,6 +3826,7 @@ public:
AstLogOr(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLogOr(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LogOr, LOGOR) ASTNODE_NODE_FUNCS(LogOr, LOGOR)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLogOr(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogOr(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogOr(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f|| %r)"; } virtual string emitVerilog() { return "%k(%l %f|| %r)"; }
virtual string emitC() { return "VL_LOGOR_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_LOGOR_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -3704,6 +3841,7 @@ public:
AstLogAnd(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLogAnd(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LogAnd, LOGAND) ASTNODE_NODE_FUNCS(LogAnd, LOGAND)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLogAnd(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogAnd(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogAnd(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f&& %r)"; } virtual string emitVerilog() { return "%k(%l %f&& %r)"; }
virtual string emitC() { return "VL_LOGAND_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_LOGAND_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -3718,6 +3856,7 @@ public:
AstLogIf(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLogIf(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LogIf, LOGIF) ASTNODE_NODE_FUNCS(LogIf, LOGIF)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLogIf(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogIf(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogIf(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f-> %r)"; } virtual string emitVerilog() { return "%k(%l %f-> %r)"; }
virtual string emitC() { return "VL_LOGIF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_LOGIF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -3732,6 +3871,7 @@ public:
AstLogIff(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstLogIff(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LogIff, LOGIFF) ASTNODE_NODE_FUNCS(LogIff, LOGIFF)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLogIff(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogIff(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogIff(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f<-> %r)"; } virtual string emitVerilog() { return "%k(%l %f<-> %r)"; }
virtual string emitC() { return "VL_LOGIFF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_LOGIFF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -3746,6 +3886,7 @@ public:
AstOr(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstOr(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Or, OR) ASTNODE_NODE_FUNCS(Or, OR)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstOr(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opOr(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opOr(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f| %r)"; } virtual string emitVerilog() { return "%k(%l %f| %r)"; }
virtual string emitC() { return "VL_OR_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_OR_%lq(%lW, %P, %li, %ri)"; }
@@ -3759,6 +3900,7 @@ public:
AstAnd(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstAnd(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(And, AND) ASTNODE_NODE_FUNCS(And, AND)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstAnd(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAnd(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAnd(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f& %r)"; } virtual string emitVerilog() { return "%k(%l %f& %r)"; }
virtual string emitC() { return "VL_AND_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_AND_%lq(%lW, %P, %li, %ri)"; }
@@ -3772,6 +3914,7 @@ public:
AstXor(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstXor(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Xor, XOR) ASTNODE_NODE_FUNCS(Xor, XOR)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstXor(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opXor(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opXor(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f^ %r)"; } virtual string emitVerilog() { return "%k(%l %f^ %r)"; }
virtual string emitC() { return "VL_XOR_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_XOR_%lq(%lW, %P, %li, %ri)"; }
@@ -3785,6 +3928,7 @@ public:
AstXnor(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstXnor(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Xnor, XNOR) ASTNODE_NODE_FUNCS(Xnor, XNOR)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstXnor(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opXnor(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opXnor(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f^ ~ %r)"; } virtual string emitVerilog() { return "%k(%l %f^ ~ %r)"; }
virtual string emitC() { return "VL_XNOR_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_XNOR_%lq(%lW, %P, %li, %ri)"; }
@@ -3798,6 +3942,7 @@ public:
AstEq(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstEq(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(Eq, EQ) ASTNODE_NODE_FUNCS(Eq, EQ)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstEq(this->fileline(), lhsp, rhsp); }
static AstNodeBiop* newTyped(FileLine* fl, AstNode* lhsp, AstNode* rhsp); // Return AstEq/AstEqD static AstNodeBiop* newTyped(FileLine* fl, AstNode* lhsp, AstNode* rhsp); // Return AstEq/AstEqD
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opEq(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opEq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f== %r)"; } virtual string emitVerilog() { return "%k(%l %f== %r)"; }
@@ -3812,6 +3957,7 @@ public:
AstEqD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstEqD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(EqD, EQD) ASTNODE_NODE_FUNCS(EqD, EQD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstEqD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opEqD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opEqD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f== %r)"; } virtual string emitVerilog() { return "%k(%l %f== %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3827,6 +3973,7 @@ public:
AstEqN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstEqN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(EqN, EQN) ASTNODE_NODE_FUNCS(EqN, EQN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstEqN(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opEqN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opEqN(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f== %r)"; } virtual string emitVerilog() { return "%k(%l %f== %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3842,6 +3989,7 @@ public:
AstNeq(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstNeq(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(Neq, NEQ) ASTNODE_NODE_FUNCS(Neq, NEQ)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstNeq(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opNeq(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opNeq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f!= %r)"; } virtual string emitVerilog() { return "%k(%l %f!= %r)"; }
virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; }
@@ -3855,6 +4003,7 @@ public:
AstNeqD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstNeqD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(NeqD, NEQD) ASTNODE_NODE_FUNCS(NeqD, NEQD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstNeqD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opNeqD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opNeqD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f!= %r)"; } virtual string emitVerilog() { return "%k(%l %f!= %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3870,6 +4019,7 @@ public:
AstNeqN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstNeqN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(NeqN, NEQN) ASTNODE_NODE_FUNCS(NeqN, NEQN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstNeqN(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opNeqN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opNeqN(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f!= %r)"; } virtual string emitVerilog() { return "%k(%l %f!= %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3885,6 +4035,7 @@ public:
AstLt(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLt(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(Lt, LT) ASTNODE_NODE_FUNCS(Lt, LT)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLt(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLt(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLt(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f< %r)"; } virtual string emitVerilog() { return "%k(%l %f< %r)"; }
virtual string emitC() { return "VL_LT_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_LT_%lq(%lW, %P, %li, %ri)"; }
@@ -3898,6 +4049,7 @@ public:
AstLtD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLtD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LtD, LTD) ASTNODE_NODE_FUNCS(LtD, LTD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLtD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLtD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLtD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f< %r)"; } virtual string emitVerilog() { return "%k(%l %f< %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3913,6 +4065,7 @@ public:
AstLtS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLtS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LtS, LTS) ASTNODE_NODE_FUNCS(LtS, LTS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLtS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLtS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLtS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f< %r)"; } virtual string emitVerilog() { return "%k(%l %f< %r)"; }
virtual string emitC() { return "VL_LTS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_LTS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -3927,6 +4080,7 @@ public:
AstLtN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLtN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LtN, LTN) ASTNODE_NODE_FUNCS(LtN, LTN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLtN(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLtN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLtN(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f< %r)"; } virtual string emitVerilog() { return "%k(%l %f< %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3942,6 +4096,7 @@ public:
AstGt(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGt(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(Gt, GT) ASTNODE_NODE_FUNCS(Gt, GT)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGt(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGt(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGt(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f> %r)"; } virtual string emitVerilog() { return "%k(%l %f> %r)"; }
virtual string emitC() { return "VL_GT_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_GT_%lq(%lW, %P, %li, %ri)"; }
@@ -3955,6 +4110,7 @@ public:
AstGtD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGtD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(GtD, GTD) ASTNODE_NODE_FUNCS(GtD, GTD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGtD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGtD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGtD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f> %r)"; } virtual string emitVerilog() { return "%k(%l %f> %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3970,6 +4126,7 @@ public:
AstGtS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGtS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(GtS, GTS) ASTNODE_NODE_FUNCS(GtS, GTS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGtS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGtS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGtS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f> %r)"; } virtual string emitVerilog() { return "%k(%l %f> %r)"; }
virtual string emitC() { return "VL_GTS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_GTS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -3984,6 +4141,7 @@ public:
AstGtN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGtN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(GtN, GTN) ASTNODE_NODE_FUNCS(GtN, GTN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGtN(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGtN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGtN(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f> %r)"; } virtual string emitVerilog() { return "%k(%l %f> %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -3999,6 +4157,7 @@ public:
AstGte(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGte(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(Gte, GTE) ASTNODE_NODE_FUNCS(Gte, GTE)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGte(this->fileline(), lhsp, rhsp); }
static AstNodeBiop* newTyped(FileLine* fl, AstNode* lhsp, AstNode* rhsp); // Return AstGte/AstGteS/AstGteD static AstNodeBiop* newTyped(FileLine* fl, AstNode* lhsp, AstNode* rhsp); // Return AstGte/AstGteS/AstGteD
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGte(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGte(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f>= %r)"; } virtual string emitVerilog() { return "%k(%l %f>= %r)"; }
@@ -4013,6 +4172,7 @@ public:
AstGteD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGteD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(GteD, GTED) ASTNODE_NODE_FUNCS(GteD, GTED)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGteD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGteD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGteD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f>= %r)"; } virtual string emitVerilog() { return "%k(%l %f>= %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4028,6 +4188,7 @@ public:
AstGteS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGteS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(GteS, GTES) ASTNODE_NODE_FUNCS(GteS, GTES)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGteS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGteS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGteS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f>= %r)"; } virtual string emitVerilog() { return "%k(%l %f>= %r)"; }
virtual string emitC() { return "VL_GTES_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_GTES_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4042,6 +4203,7 @@ public:
AstGteN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstGteN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(GteN, GTEN) ASTNODE_NODE_FUNCS(GteN, GTEN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstGteN(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGteN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opGteN(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f>= %r)"; } virtual string emitVerilog() { return "%k(%l %f>= %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4057,6 +4219,7 @@ public:
AstLte(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLte(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(Lte, LTE) ASTNODE_NODE_FUNCS(Lte, LTE)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLte(this->fileline(), lhsp, rhsp); }
static AstNodeBiop* newTyped(FileLine* fl, AstNode* lhsp, AstNode* rhsp); // Return AstLte/AstLteS/AstLteD static AstNodeBiop* newTyped(FileLine* fl, AstNode* lhsp, AstNode* rhsp); // Return AstLte/AstLteS/AstLteD
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLte(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLte(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f<= %r)"; } virtual string emitVerilog() { return "%k(%l %f<= %r)"; }
@@ -4071,6 +4234,7 @@ public:
AstLteD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLteD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LteD, LTED) ASTNODE_NODE_FUNCS(LteD, LTED)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLteD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLteD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLteD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f<= %r)"; } virtual string emitVerilog() { return "%k(%l %f<= %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4086,6 +4250,7 @@ public:
AstLteS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLteS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LteS, LTES) ASTNODE_NODE_FUNCS(LteS, LTES)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLteS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLteS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLteS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f<= %r)"; } virtual string emitVerilog() { return "%k(%l %f<= %r)"; }
virtual string emitC() { return "VL_LTES_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_LTES_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4100,6 +4265,7 @@ public:
AstLteN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstLteN(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(LteN, LTEN) ASTNODE_NODE_FUNCS(LteN, LTEN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstLteN(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLteN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLteN(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f<= %r)"; } virtual string emitVerilog() { return "%k(%l %f<= %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4117,6 +4283,7 @@ public:
if (setwidth) { dtypeSetLogicSized(setwidth,setwidth,AstNumeric::UNSIGNED); } if (setwidth) { dtypeSetLogicSized(setwidth,setwidth,AstNumeric::UNSIGNED); }
} }
ASTNODE_NODE_FUNCS(ShiftL, SHIFTL) ASTNODE_NODE_FUNCS(ShiftL, SHIFTL)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstShiftL(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opShiftL(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opShiftL(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f<< %r)"; } virtual string emitVerilog() { return "%k(%l %f<< %r)"; }
virtual string emitC() { return "VL_SHIFTL_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_SHIFTL_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4132,6 +4299,7 @@ public:
if (setwidth) { dtypeSetLogicSized(setwidth,setwidth,AstNumeric::UNSIGNED); } if (setwidth) { dtypeSetLogicSized(setwidth,setwidth,AstNumeric::UNSIGNED); }
} }
ASTNODE_NODE_FUNCS(ShiftR, SHIFTR) ASTNODE_NODE_FUNCS(ShiftR, SHIFTR)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstShiftR(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opShiftR(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opShiftR(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f>> %r)"; } virtual string emitVerilog() { return "%k(%l %f>> %r)"; }
virtual string emitC() { return "VL_SHIFTR_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_SHIFTR_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4150,6 +4318,7 @@ public:
if (setwidth) { dtypeSetLogicSized(setwidth,setwidth,AstNumeric::SIGNED); } if (setwidth) { dtypeSetLogicSized(setwidth,setwidth,AstNumeric::SIGNED); }
} }
ASTNODE_NODE_FUNCS(ShiftRS, SHIFTRS) ASTNODE_NODE_FUNCS(ShiftRS, SHIFTRS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstShiftRS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) {
out.opShiftRS(lhs,rhs,lhsp()->widthMinV()); } out.opShiftRS(lhs,rhs,lhsp()->widthMinV()); }
virtual string emitVerilog() { return "%k(%l %f>>> %r)"; } virtual string emitVerilog() { return "%k(%l %f>>> %r)"; }
@@ -4165,6 +4334,7 @@ public:
AstAdd(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstAdd(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Add, ADD) ASTNODE_NODE_FUNCS(Add, ADD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstAdd(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAdd(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAdd(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f+ %r)"; } virtual string emitVerilog() { return "%k(%l %f+ %r)"; }
virtual string emitC() { return "VL_ADD_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_ADD_%lq(%lW, %P, %li, %ri)"; }
@@ -4178,6 +4348,7 @@ public:
AstAddD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstAddD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeSetDouble(); } dtypeSetDouble(); }
ASTNODE_NODE_FUNCS(AddD, ADDD) ASTNODE_NODE_FUNCS(AddD, ADDD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstAddD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAddD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAddD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f+ %r)"; } virtual string emitVerilog() { return "%k(%l %f+ %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4193,6 +4364,7 @@ public:
AstSub(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstSub(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Sub, SUB) ASTNODE_NODE_FUNCS(Sub, SUB)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstSub(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opSub(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opSub(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f- %r)"; } virtual string emitVerilog() { return "%k(%l %f- %r)"; }
virtual string emitC() { return "VL_SUB_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_SUB_%lq(%lW, %P, %li, %ri)"; }
@@ -4206,6 +4378,7 @@ public:
AstSubD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstSubD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetDouble(); } dtypeSetDouble(); }
ASTNODE_NODE_FUNCS(SubD, SUBD) ASTNODE_NODE_FUNCS(SubD, SUBD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstSubD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opSubD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opSubD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f- %r)"; } virtual string emitVerilog() { return "%k(%l %f- %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4221,6 +4394,7 @@ public:
AstMul(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstMul(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Mul, MUL) ASTNODE_NODE_FUNCS(Mul, MUL)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstMul(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMul(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMul(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f* %r)"; } virtual string emitVerilog() { return "%k(%l %f* %r)"; }
virtual string emitC() { return "VL_MUL_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_MUL_%lq(%lW, %P, %li, %ri)"; }
@@ -4235,6 +4409,7 @@ public:
AstMulD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstMulD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeSetDouble(); } dtypeSetDouble(); }
ASTNODE_NODE_FUNCS(MulD, MULD) ASTNODE_NODE_FUNCS(MulD, MULD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstMulD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMulD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMulD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f* %r)"; } virtual string emitVerilog() { return "%k(%l %f* %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4250,6 +4425,7 @@ public:
AstMulS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) { AstMulS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiComAsv(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(MulS, MULS) ASTNODE_NODE_FUNCS(MulS, MULS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstMulS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMulS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opMulS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f* %r)"; } virtual string emitVerilog() { return "%k(%l %f* %r)"; }
virtual string emitC() { return "VL_MULS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_MULS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4265,6 +4441,7 @@ public:
AstDiv(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstDiv(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Div, DIV) ASTNODE_NODE_FUNCS(Div, DIV)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstDiv(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDiv(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDiv(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f/ %r)"; } virtual string emitVerilog() { return "%k(%l %f/ %r)"; }
virtual string emitC() { return "VL_DIV_%nq%lq%rq(%lw, %P, %li, %ri)"; } virtual string emitC() { return "VL_DIV_%nq%lq%rq(%lw, %P, %li, %ri)"; }
@@ -4278,6 +4455,7 @@ public:
AstDivD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstDivD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetDouble(); } dtypeSetDouble(); }
ASTNODE_NODE_FUNCS(DivD, DIVD) ASTNODE_NODE_FUNCS(DivD, DIVD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstDivD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDivD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDivD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f/ %r)"; } virtual string emitVerilog() { return "%k(%l %f/ %r)"; }
virtual string emitC() { V3ERROR_NA; return ""; } virtual string emitC() { V3ERROR_NA; return ""; }
@@ -4293,6 +4471,7 @@ public:
AstDivS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstDivS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(DivS, DIVS) ASTNODE_NODE_FUNCS(DivS, DIVS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstDivS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDivS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opDivS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f/ %r)"; } virtual string emitVerilog() { return "%k(%l %f/ %r)"; }
virtual string emitC() { return "VL_DIVS_%nq%lq%rq(%lw, %P, %li, %ri)"; } virtual string emitC() { return "VL_DIVS_%nq%lq%rq(%lw, %P, %li, %ri)"; }
@@ -4307,6 +4486,7 @@ public:
AstModDiv(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstModDiv(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(ModDiv, MODDIV) ASTNODE_NODE_FUNCS(ModDiv, MODDIV)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstModDiv(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opModDiv(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opModDiv(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f%% %r)"; } virtual string emitVerilog() { return "%k(%l %f%% %r)"; }
virtual string emitC() { return "VL_MODDIV_%nq%lq%rq(%lw, %P, %li, %ri)"; } virtual string emitC() { return "VL_MODDIV_%nq%lq%rq(%lw, %P, %li, %ri)"; }
@@ -4320,6 +4500,7 @@ public:
AstModDivS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstModDivS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(ModDivS, MODDIVS) ASTNODE_NODE_FUNCS(ModDivS, MODDIVS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstModDivS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opModDivS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opModDivS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f%% %r)"; } virtual string emitVerilog() { return "%k(%l %f%% %r)"; }
virtual string emitC() { return "VL_MODDIVS_%nq%lq%rq(%lw, %P, %li, %ri)"; } virtual string emitC() { return "VL_MODDIVS_%nq%lq%rq(%lw, %P, %li, %ri)"; }
@@ -4334,6 +4515,7 @@ public:
AstPow(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstPow(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(Pow, POW) ASTNODE_NODE_FUNCS(Pow, POW)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstPow(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPow(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPow(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f** %r)"; } virtual string emitVerilog() { return "%k(%l %f** %r)"; }
virtual string emitC() { return "VL_POW_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_POW_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4347,6 +4529,7 @@ public:
AstPowD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstPowD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetDouble(); } dtypeSetDouble(); }
ASTNODE_NODE_FUNCS(PowD, POWD) ASTNODE_NODE_FUNCS(PowD, POWD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstPowD(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowD(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowD(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f** %r)"; } virtual string emitVerilog() { return "%k(%l %f** %r)"; }
virtual string emitC() { return "pow(%li,%ri)"; } virtual string emitC() { return "pow(%li,%ri)"; }
@@ -4361,6 +4544,7 @@ public:
AstPowSU(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstPowSU(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(PowSU, POWSU) ASTNODE_NODE_FUNCS(PowSU, POWSU)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstPowSU(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowSU(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowSU(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f** %r)"; } virtual string emitVerilog() { return "%k(%l %f** %r)"; }
virtual string emitC() { return "VL_POWSS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri, 1,0)"; } virtual string emitC() { return "VL_POWSS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri, 1,0)"; }
@@ -4375,6 +4559,7 @@ public:
AstPowSS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstPowSS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(PowSS, POWSS) ASTNODE_NODE_FUNCS(PowSS, POWSS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstPowSS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowSS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowSS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f** %r)"; } virtual string emitVerilog() { return "%k(%l %f** %r)"; }
virtual string emitC() { return "VL_POWSS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri, 1,1)"; } virtual string emitC() { return "VL_POWSS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri, 1,1)"; }
@@ -4389,6 +4574,7 @@ public:
AstPowUS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstPowUS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(PowUS, POWUS) ASTNODE_NODE_FUNCS(PowUS, POWUS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstPowUS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowUS(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opPowUS(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f** %r)"; } virtual string emitVerilog() { return "%k(%l %f** %r)"; }
virtual string emitC() { return "VL_POWSS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri, 0,1)"; } virtual string emitC() { return "VL_POWSS_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri, 0,1)"; }
@@ -4403,6 +4589,7 @@ public:
AstEqCase(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstEqCase(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(EqCase, EQCASE) ASTNODE_NODE_FUNCS(EqCase, EQCASE)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstEqCase(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opCaseEq(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opCaseEq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f=== %r)"; } virtual string emitVerilog() { return "%k(%l %f=== %r)"; }
virtual string emitC() { return "VL_EQ_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_EQ_%lq(%lW, %P, %li, %ri)"; }
@@ -4416,6 +4603,7 @@ public:
AstNeqCase(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { AstNeqCase(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(NeqCase, NEQCASE) ASTNODE_NODE_FUNCS(NeqCase, NEQCASE)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstNeqCase(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opCaseNeq(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opCaseNeq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f!== %r)"; } virtual string emitVerilog() { return "%k(%l %f!== %r)"; }
virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; }
@@ -4430,6 +4618,7 @@ public:
AstEqWild(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstEqWild(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(EqWild, EQWILD) ASTNODE_NODE_FUNCS(EqWild, EQWILD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstEqWild(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opWildEq(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opWildEq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f==? %r)"; } virtual string emitVerilog() { return "%k(%l %f==? %r)"; }
virtual string emitC() { return "VL_EQ_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_EQ_%lq(%lW, %P, %li, %ri)"; }
@@ -4443,6 +4632,7 @@ public:
AstNeqWild(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstNeqWild(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeSetLogicBool(); } dtypeSetLogicBool(); }
ASTNODE_NODE_FUNCS(NeqWild, NEQWILD) ASTNODE_NODE_FUNCS(NeqWild, NEQWILD)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstNeqWild(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opWildNeq(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opWildNeq(lhs,rhs); }
virtual string emitVerilog() { return "%k(%l %f!=? %r)"; } virtual string emitVerilog() { return "%k(%l %f!=? %r)"; }
virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; } virtual string emitC() { return "VL_NEQ_%lq(%lW, %P, %li, %ri)"; }
@@ -4462,6 +4652,7 @@ public:
} }
} }
ASTNODE_NODE_FUNCS(Concat, CONCAT) ASTNODE_NODE_FUNCS(Concat, CONCAT)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstConcat(this->fileline(), lhsp, rhsp); }
virtual string emitVerilog() { return "%f{%l, %k%r}"; } virtual string emitVerilog() { return "%f{%l, %k%r}"; }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opConcat(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opConcat(lhs,rhs); }
virtual string emitC() { return "VL_CONCAT_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_CONCAT_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4477,6 +4668,7 @@ public:
dtypeSetString(); dtypeSetString();
} }
ASTNODE_NODE_FUNCS(ConcatN, CONCATN) ASTNODE_NODE_FUNCS(ConcatN, CONCATN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstConcatN(this->fileline(), lhsp, rhsp); }
virtual string emitVerilog() { return "%f{%l, %k%r}"; } virtual string emitVerilog() { return "%f{%l, %k%r}"; }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opConcatN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opConcatN(lhs,rhs); }
virtual string emitC() { return "VL_CONCATN_NNN(%li, %ri)"; } virtual string emitC() { return "VL_CONCATN_NNN(%li, %ri)"; }
@@ -4503,6 +4695,7 @@ public:
AstReplicate(FileLine* fl, AstNode* lhsp, uint32_t repCount) AstReplicate(FileLine* fl, AstNode* lhsp, uint32_t repCount)
: AstNodeBiop(fl, lhsp, new AstConst(fl, repCount)) { init(); } : AstNodeBiop(fl, lhsp, new AstConst(fl, repCount)) { init(); }
ASTNODE_NODE_FUNCS(Replicate, REPLICATE) ASTNODE_NODE_FUNCS(Replicate, REPLICATE)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstReplicate(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opRepl(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opRepl(lhs,rhs); }
virtual string emitVerilog() { return "%f{%r{%k%l}}"; } virtual string emitVerilog() { return "%f{%r{%k%l}}"; }
virtual string emitC() { return "VL_REPLICATE_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_REPLICATE_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4521,6 +4714,7 @@ public:
AstReplicateN(FileLine* fl, AstNode* lhsp, uint32_t repCount) AstReplicateN(FileLine* fl, AstNode* lhsp, uint32_t repCount)
: AstNodeBiop(fl, lhsp, new AstConst(fl, repCount)) { init(); } : AstNodeBiop(fl, lhsp, new AstConst(fl, repCount)) { init(); }
ASTNODE_NODE_FUNCS(ReplicateN, REPLICATEN) ASTNODE_NODE_FUNCS(ReplicateN, REPLICATEN)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstReplicateN(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opReplN(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opReplN(lhs,rhs); }
virtual string emitVerilog() { return "%f{%r{%k%l}}"; } virtual string emitVerilog() { return "%f{%r{%k%l}}"; }
virtual string emitC() { return "VL_REPLICATEN_NN%rq(0,0,%rw, %li, %ri)"; } virtual string emitC() { return "VL_REPLICATEN_NN%rq(0,0,%rw, %li, %ri)"; }
@@ -4535,6 +4729,7 @@ class AstStreamL : public AstNodeStream {
public: public:
AstStreamL(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeStream(fl, lhsp, rhsp) {} AstStreamL(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeStream(fl, lhsp, rhsp) {}
ASTNODE_NODE_FUNCS(StreamL, STREAML) ASTNODE_NODE_FUNCS(StreamL, STREAML)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstStreamL(this->fileline(), lhsp, rhsp); }
virtual string emitVerilog() { return "%f{ << %r %k{%l} }"; } virtual string emitVerilog() { return "%f{ << %r %k{%l} }"; }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opStreamL(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opStreamL(lhs,rhs); }
virtual string emitC() { return "VL_STREAML_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitC() { return "VL_STREAML_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; }
@@ -4548,6 +4743,7 @@ class AstStreamR : public AstNodeStream {
public: public:
AstStreamR(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeStream(fl, lhsp, rhsp) {} AstStreamR(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeStream(fl, lhsp, rhsp) {}
ASTNODE_NODE_FUNCS(StreamR, STREAMR) ASTNODE_NODE_FUNCS(StreamR, STREAMR)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstStreamR(this->fileline(), lhsp, rhsp); }
virtual string emitVerilog() { return "%f{ >> %r %k{%l} }"; } virtual string emitVerilog() { return "%f{ >> %r %k{%l} }"; }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAssign(lhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opAssign(lhs); }
virtual string emitC() { return isWide() ? "VL_ASSIGN_W(%nw, %P, %li)" : "%li"; } virtual string emitC() { return isWide() ? "VL_ASSIGN_W(%nw, %P, %li)" : "%li"; }
@@ -4563,6 +4759,7 @@ public:
AstBufIf1(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { AstBufIf1(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {
dtypeFrom(lhsp); } dtypeFrom(lhsp); }
ASTNODE_NODE_FUNCS(BufIf1, BUFIF1) ASTNODE_NODE_FUNCS(BufIf1, BUFIF1)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstBufIf1(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opBufIf1(lhs,rhs); } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opBufIf1(lhs,rhs); }
virtual string emitVerilog() { return "bufif(%r,%l)"; } virtual string emitVerilog() { return "bufif(%r,%l)"; }
virtual string emitC() { V3ERROR_NA; return "";} // Lclean || Rclean virtual string emitC() { V3ERROR_NA; return "";} // Lclean || Rclean
@@ -4575,6 +4772,7 @@ class AstFGetS : public AstNodeBiop {
public: public:
AstFGetS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {} AstFGetS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) {}
ASTNODE_NODE_FUNCS(FGetS, FGETS) ASTNODE_NODE_FUNCS(FGetS, FGETS)
virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) { return new AstFGetS(this->fileline(), lhsp, rhsp); }
virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { V3ERROR_NA; } virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { V3ERROR_NA; }
virtual string emitVerilog() { return "%f$fgets(%l,%r)"; } virtual string emitVerilog() { return "%f$fgets(%l,%r)"; }
virtual string emitC() { return "VL_FGETS_%nqX%rq(%lw, %P, &(%li), %ri)"; } virtual string emitC() { return "VL_FGETS_%nqX%rq(%lw, %P, &(%li), %ri)"; }
@@ -5041,6 +5239,21 @@ public:
}; };
class AstCReset : public AstNodeStmt {
//Reset variable at startup
public:
AstCReset(FileLine* fl, AstNode* exprsp)
: AstNodeStmt(fl) {
addNOp1p(exprsp);
}
ASTNODE_NODE_FUNCS(CReset, CRESET)
virtual bool isGateOptimizable() const { return false; }
virtual bool isPredictOptimizable() const { return false; }
virtual V3Hash sameHash() const { return V3Hash(); }
virtual bool same(AstNode* samep) const { return true; }
AstVarRef* varrefp() const { return op1p()->castVarRef(); } // op1= varref to reset
};
class AstCStmt : public AstNodeStmt { class AstCStmt : public AstNodeStmt {
// Emit C statement // Emit C statement
public: public:
@@ -5076,7 +5289,7 @@ class AstTypeTable : public AstNode {
typedef map<VBasicTypeKey,AstBasicDType*> DetailedMap; typedef map<VBasicTypeKey,AstBasicDType*> DetailedMap;
DetailedMap m_detailedMap; DetailedMap m_detailedMap;
public: public:
AstTypeTable(FileLine* fl) : AstNode(fl) { explicit AstTypeTable(FileLine* fl) : AstNode(fl) {
for (int i=0; i<AstBasicDTypeKwd::_ENUM_MAX; ++i) m_basicps[i] = NULL; for (int i=0; i<AstBasicDTypeKwd::_ENUM_MAX; ++i) m_basicps[i] = NULL;
} }
ASTNODE_NODE_FUNCS(TypeTable, TYPETABLE) ASTNODE_NODE_FUNCS(TypeTable, TYPETABLE)
+29 -4
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -56,7 +56,7 @@ public:
m_anyFuncInBegin = false; m_anyFuncInBegin = false;
} }
~BeginState() {} ~BeginState() {}
void userMarkChanged(AstNodeFTask* nodep) { void userMarkChanged(AstNode* nodep) {
nodep->user1(true); nodep->user1(true);
m_anyFuncInBegin = true; m_anyFuncInBegin = true;
} }
@@ -160,12 +160,13 @@ private:
} else { } else {
nodep->unlinkFrBack(); nodep->unlinkFrBack();
} }
pushDeletep(nodep); nodep=NULL; pushDeletep(nodep); VL_DANGLING(nodep);
} }
virtual void visit(AstVar* nodep, AstNUser*) { virtual void visit(AstVar* nodep, AstNUser*) {
if (m_unnamedScope != "") { if (m_unnamedScope != "") {
// Rename it // Rename it
nodep->name(m_unnamedScope+"__DOT__"+nodep->name()); nodep->name(m_unnamedScope+"__DOT__"+nodep->name());
m_statep->userMarkChanged(nodep);
// Move to module // Move to module
nodep->unlinkFrBack(); nodep->unlinkFrBack();
if (m_ftaskp) m_ftaskp->addStmtsp(nodep); // Begins under funcs just move into the func if (m_ftaskp) m_ftaskp->addStmtsp(nodep); // Begins under funcs just move into the func
@@ -175,6 +176,7 @@ private:
virtual void visit(AstCell* nodep, AstNUser*) { virtual void visit(AstCell* nodep, AstNUser*) {
UINFO(8," CELL "<<nodep<<endl); UINFO(8," CELL "<<nodep<<endl);
if (m_namedScope != "") { if (m_namedScope != "") {
m_statep->userMarkChanged(nodep);
// Rename it // Rename it
nodep->name(m_namedScope+"__DOT__"+nodep->name()); nodep->name(m_namedScope+"__DOT__"+nodep->name());
UINFO(8," rename to "<<nodep->name()<<endl); UINFO(8," rename to "<<nodep->name()<<endl);
@@ -182,6 +184,14 @@ private:
nodep->unlinkFrBack(); nodep->unlinkFrBack();
m_modp->addStmtp(nodep); m_modp->addStmtp(nodep);
} }
nodep->iterateChildren(*this);
}
virtual void visit(AstVarXRef* nodep, AstNUser*) {
UINFO(9, " VARXREF "<<nodep<<endl);
if (m_namedScope != "" && nodep->inlinedDots() == "") {
nodep->inlinedDots(m_namedScope);
UINFO(9, " rescope to "<<nodep<<endl);
}
} }
virtual void visit(AstScopeName* nodep, AstNUser*) { virtual void visit(AstScopeName* nodep, AstNUser*) {
// If there's a %m in the display text, we add a special node that will contain the name() // If there's a %m in the display text, we add a special node that will contain the name()
@@ -215,7 +225,7 @@ private:
} }
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
m_ifDepth = prevIfDepth; m_ifDepth = prevIfDepth;
} }
virtual void visit(AstNode* nodep, AstNUser*) { virtual void visit(AstNode* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
} }
@@ -249,6 +259,21 @@ private:
} }
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
} }
virtual void visit(AstVarRef* nodep, AstNUser*) {
if (nodep->varp()->user1()) { // It was converted
UINFO(9, " relinVarRef "<<nodep<<endl);
nodep->name(nodep->varp()->name());
}
nodep->iterateChildren(*this);
}
virtual void visit(AstIfaceRefDType* nodep, AstNUser*) {
// May have changed cell names
// TypeTable is always after all modules, so names are stable
UINFO(8," IFACEREFDTYPE "<<nodep<<endl);
if (nodep->cellp()) nodep->cellName(nodep->cellp()->name());
UINFO(8," rename to "<<nodep<<endl);
nodep->iterateChildren(*this);
}
//-------------------- //--------------------
virtual void visit(AstNode* nodep, AstNUser*) { virtual void visit(AstNode* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -128,7 +128,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
BranchVisitor(AstNetlist* nodep) { explicit BranchVisitor(AstNetlist* nodep) {
reset(); reset();
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
calc_tasks(); calc_tasks();
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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 -6
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -186,14 +186,18 @@ private:
// NODE STATE // NODE STATE
// Nothing! // This may be called deep inside other routines // Nothing! // This may be called deep inside other routines
// // so userp and friends may not be used // // so userp and friends may not be used
// VISITORS // METHODS
virtual void visit(AstNode* nodep, AstNUser*) { void processAndIterate(AstNode* nodep) {
BrokenTable::addInTree(nodep, nodep->maybePointedTo()); BrokenTable::addInTree(nodep, nodep->maybePointedTo());
nodep->iterateChildrenConst(*this); nodep->iterateChildrenConst(*this);
} }
// VISITORS
virtual void visit(AstNode* nodep, AstNUser*) {
processAndIterate(nodep);
}
public: public:
// CONSTUCTORS // CONSTUCTORS
BrokenMarkVisitor(AstNetlist* nodep) { explicit BrokenMarkVisitor(AstNetlist* nodep) {
nodep->accept(*this); nodep->accept(*this);
} }
virtual ~BrokenMarkVisitor() {} virtual ~BrokenMarkVisitor() {}
@@ -210,7 +214,7 @@ private:
nodep->v3fatalSrc("Width != WidthMin"); nodep->v3fatalSrc("Width != WidthMin");
} }
} }
virtual void visit(AstNode* nodep, AstNUser*) { void processAndIterate(AstNode* nodep) {
BrokenTable::setUnder(nodep,true); BrokenTable::setUnder(nodep,true);
if (const char* whyp=nodep->broken()) { if (const char* whyp=nodep->broken()) {
nodep->v3fatalSrc("Broken link in node (or something without maybePointedTo): "<<whyp); nodep->v3fatalSrc("Broken link in node (or something without maybePointedTo): "<<whyp);
@@ -232,9 +236,12 @@ private:
nodep->iterateChildrenConst(*this); nodep->iterateChildrenConst(*this);
BrokenTable::setUnder(nodep,false); BrokenTable::setUnder(nodep,false);
} }
virtual void visit(AstNode* nodep, AstNUser*) {
processAndIterate(nodep);
}
public: public:
// CONSTUCTORS // CONSTUCTORS
BrokenCheckVisitor(AstNetlist* nodep) { explicit BrokenCheckVisitor(AstNetlist* nodep) {
nodep->accept(*this); nodep->accept(*this);
} }
virtual ~BrokenCheckVisitor() {} virtual ~BrokenCheckVisitor() {}
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+14 -16
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -112,7 +112,7 @@ private:
} }
public: public:
// CONSTUCTORS // CONSTUCTORS
CaseLintVisitor(AstNodeCase* nodep) { explicit CaseLintVisitor(AstNodeCase* nodep) {
m_caseExprp = NULL; m_caseExprp = NULL;
nodep->accept(*this); nodep->accept(*this);
} }
@@ -246,7 +246,7 @@ private:
if (m_valueItem[a] != m_valueItem[b]) { same=false; break; } if (m_valueItem[a] != m_valueItem[b]) { same=false; break; }
} }
if (same) { if (same) {
tree1p->deleteTree(); tree1p=NULL; tree1p->deleteTree(); VL_DANGLING(tree1p);
return tree0p; return tree0p;
} }
@@ -295,8 +295,8 @@ private:
if (ifrootp) nodep->replaceWith(ifrootp); if (ifrootp) nodep->replaceWith(ifrootp);
else nodep->unlinkFrBack(); else nodep->unlinkFrBack();
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
cexprp->deleteTree(); cexprp=NULL; cexprp->deleteTree(); VL_DANGLING(cexprp);
if (debug()>=9) ifrootp->dumpTree(cout," _simp: "); if (debug()>=9) ifrootp->dumpTree(cout," _simp: ");
} }
@@ -327,7 +327,7 @@ private:
AstConst* iconstp = icondp->castConst(); AstConst* iconstp = icondp->castConst();
if (iconstp && neverItem(nodep, iconstp)) { if (iconstp && neverItem(nodep, iconstp)) {
// X in casez can't ever be executed // X in casez can't ever be executed
icondp->deleteTree(); icondp=NULL; iconstp=NULL; icondp->deleteTree(); VL_DANGLING(icondp); VL_DANGLING(iconstp);
// For simplicity, make expression that is not equal, and let later // For simplicity, make expression that is not equal, and let later
// optimizations remove it // optimizations remove it
condp = new AstConst(itemp->fileline(), AstConst::LogicFalse()); condp = new AstConst(itemp->fileline(), AstConst::LogicFalse());
@@ -351,7 +351,7 @@ private:
AstNode* and2p = new AstAnd(itemp->fileline(), AstNode* and2p = new AstAnd(itemp->fileline(),
new AstConst(itemp->fileline(), numval), new AstConst(itemp->fileline(), numval),
new AstConst(itemp->fileline(), nummask)); new AstConst(itemp->fileline(), nummask));
icondp->deleteTree(); icondp=NULL; iconstp=NULL; icondp->deleteTree(); VL_DANGLING(icondp); VL_DANGLING(iconstp);
condp = AstEq::newTyped(itemp->fileline(), and1p, and2p); condp = AstEq::newTyped(itemp->fileline(), and1p, and2p);
} else { } else {
// Not a caseX mask, we can simply build CASEEQ(cexpr icond) // Not a caseX mask, we can simply build CASEEQ(cexpr icond)
@@ -369,7 +369,7 @@ private:
itemp->condsp(ifexprp); itemp->condsp(ifexprp);
} }
} }
cexprp->deleteTree(); cexprp=NULL; cexprp->deleteTree(); VL_DANGLING(cexprp);
if (!hadDefault) { if (!hadDefault) {
// If there was no default, add a empty one, this greatly simplifies below code // If there was no default, add a empty one, this greatly simplifies below code
// and constant propagation will just eliminate it for us later. // and constant propagation will just eliminate it for us later.
@@ -408,10 +408,9 @@ private:
} }
} }
{ // Make the new lower IF and attach in the tree { // Make the new lower IF and attach in the tree
AstNode* itemexprp = ifexprp; ifexprp=NULL; AstNode* itemexprp = ifexprp; VL_DANGLING(ifexprp);
if (depth == (CASE_ENCODER_GROUP_DEPTH)) { // End of group - can skip the condition if (depth == (CASE_ENCODER_GROUP_DEPTH)) { // End of group - can skip the condition
itemexprp->deleteTree(); itemexprp=NULL; itemexprp->deleteTree(); VL_DANGLING(itemexprp);
// cppcheck-suppress redundantAssignment
itemexprp = new AstConst(itemp->fileline(), AstConst::LogicTrue()); itemexprp = new AstConst(itemp->fileline(), AstConst::LogicTrue());
} }
AstIf* newp = new AstIf(itemp->fileline(), itemexprp, istmtsp, NULL); AstIf* newp = new AstIf(itemp->fileline(), itemexprp, istmtsp, NULL);
@@ -427,7 +426,7 @@ private:
if (debug()>=9) grouprootp->dumpTree(cout," _new: "); if (debug()>=9) grouprootp->dumpTree(cout," _new: ");
if (grouprootp) nodep->replaceWith(grouprootp); if (grouprootp) nodep->replaceWith(grouprootp);
else nodep->unlinkFrBack(); else nodep->unlinkFrBack();
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceCaseParallel(AstCase* nodep, bool noOverlapsAllCovered) { void replaceCaseParallel(AstCase* nodep, bool noOverlapsAllCovered) {
@@ -460,11 +459,10 @@ private:
// It's a simple priority encoder or complete statement // It's a simple priority encoder or complete statement
// we can make a tree of statements to avoid extra comparisons // we can make a tree of statements to avoid extra comparisons
++m_statCaseFast; ++m_statCaseFast;
replaceCaseFast(nodep); nodep=NULL; replaceCaseFast(nodep); VL_DANGLING(nodep);
} else { } else {
++m_statCaseSlow; ++m_statCaseSlow;
// cppcheck-supporess uselessAssignmentPtrArg replaceCaseComplicated(nodep); VL_DANGLING(nodep);
replaceCaseComplicated(nodep); nodep=NULL;
} }
} }
//-------------------- //--------------------
@@ -475,7 +473,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
CaseVisitor(AstNetlist* nodep) { explicit CaseVisitor(AstNetlist* nodep) {
m_caseNoOverlapsAllCovered = false; m_caseNoOverlapsAllCovered = false;
nodep->accept(*this); nodep->accept(*this);
} }
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2004-2015 by Wilson Snyder. This program is free software; you can // Copyright 2004-2016 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.
@@ -176,7 +176,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
CastVisitor(AstNetlist* nodep) { explicit CastVisitor(AstNetlist* nodep) {
nodep->accept(*this); nodep->accept(*this);
} }
virtual ~CastVisitor() {} virtual ~CastVisitor() {}
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2004-2015 by Wilson Snyder. This program is free software; you can // Copyright 2004-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -184,7 +184,7 @@ private:
} }
public: public:
// CONSTUCTORS // CONSTUCTORS
CdcWidthVisitor(AstNode* nodep) { explicit CdcWidthVisitor(AstNode* nodep) {
m_maxLineno = 0; m_maxLineno = 0;
m_maxFilenameLen = 0; m_maxFilenameLen = 0;
nodep->accept(*this); nodep->accept(*this);
@@ -496,7 +496,7 @@ private:
} }
string filename = v3Global.opt.makeDir()+"/"+v3Global.opt.prefix()+"__cdc_edges.txt"; string filename = v3Global.opt.makeDir()+"/"+v3Global.opt.prefix()+"__cdc_edges.txt";
const auto_ptr<ofstream> ofp (V3File::new_ofstream(filename)); const VL_UNIQUE_PTR<ofstream> ofp (V3File::new_ofstream(filename));
if (ofp->fail()) v3fatalSrc("Can't write "<<filename); if (ofp->fail()) v3fatalSrc("Can't write "<<filename);
*ofp<<"Edge Report for "<<v3Global.opt.prefix()<<endl; *ofp<<"Edge Report for "<<v3Global.opt.prefix()<<endl;
@@ -726,7 +726,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
CdcVisitor(AstNode* nodep) { explicit CdcVisitor(AstNode* nodep) {
m_logicVertexp = NULL; m_logicVertexp = NULL;
m_scopep = NULL; m_scopep = NULL;
m_modp = NULL; m_modp = NULL;
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+59 -9
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -51,12 +51,54 @@ public:
AstNodeModule* m_topModp; // Top module AstNodeModule* m_topModp; // Top module
AstScope* m_scopetopp; // Scope under TOPSCOPE AstScope* m_scopetopp; // Scope under TOPSCOPE
AstCFunc* m_chgFuncp; // Change function we're building AstCFunc* m_chgFuncp; // Change function we're building
AstCFunc* m_tlChgFuncp; // Top level change function we're building
int m_numStmts; // Number of statements added to m_chgFuncp
int m_funcNum; // Number of change functions emitted
ChangedState() { ChangedState() {
m_topModp = NULL; m_topModp = NULL;
m_chgFuncp = NULL; m_chgFuncp = NULL;
m_scopetopp = NULL; m_scopetopp = NULL;
m_tlChgFuncp = NULL;
m_numStmts = 0;
m_funcNum = 0;
} }
~ChangedState() {} ~ChangedState() {}
void maybeCreateChgFuncp() {
// Don't create an extra function call if splitting is disabled
if (!v3Global.opt.outputSplitCFuncs()) {
m_chgFuncp = m_tlChgFuncp;
return;
}
if (!m_chgFuncp || v3Global.opt.outputSplitCFuncs() < m_numStmts) {
m_chgFuncp = new AstCFunc(m_scopetopp->fileline(), "_change_request_" + cvtToStr(++m_funcNum), m_scopetopp, "QData");
m_chgFuncp->argTypes(EmitCBaseVisitor::symClassVar());
m_chgFuncp->symProlog(true);
m_chgFuncp->declPrivate(true);
m_scopetopp->addActivep(m_chgFuncp);
// Add a top call to it
AstCCall* callp = new AstCCall(m_scopetopp->fileline(), m_chgFuncp);
callp->argTypes("vlSymsp");
if (!m_tlChgFuncp->stmtsp()) {
m_tlChgFuncp->addStmtsp(new AstCReturn(m_scopetopp->fileline(), callp));
} else {
AstCReturn* returnp = m_tlChgFuncp->stmtsp()->castCReturn();
if (!returnp) m_scopetopp->v3fatalSrc("Lost CReturn in top change function");
// This is currently using AstLogOr which will shortcut the evaluation if
// any function returns true. This is likely what we want and is similar to the logic already in use
// inside V3EmitC, however, it also means that verbose logging may miss to print change detect variables.
AstNode* newp = new AstCReturn(m_scopetopp->fileline(),
new AstLogOr(m_scopetopp->fileline(), callp,
returnp->lhsp()->unlinkFrBack()));
returnp->replaceWith(newp);
returnp->deleteTree(); VL_DANGLING(returnp);
}
m_numStmts = 0;
}
}
}; };
//###################################################################### //######################################################################
@@ -87,6 +129,8 @@ private:
<<"... Could recompile with DETECTARRAY_MAX_INDEXES increased"<<endl); <<"... Could recompile with DETECTARRAY_MAX_INDEXES increased"<<endl);
return; return;
} }
m_statep->maybeCreateChgFuncp();
AstChangeDet* changep = new AstChangeDet (m_vscp->fileline(), AstChangeDet* changep = new AstChangeDet (m_vscp->fileline(),
m_varEqnp->cloneTree(true), m_varEqnp->cloneTree(true),
m_newRvEqnp->cloneTree(true), false); m_newRvEqnp->cloneTree(true), false);
@@ -95,6 +139,8 @@ private:
m_newLvEqnp->cloneTree(true), m_newLvEqnp->cloneTree(true),
m_varEqnp->cloneTree(true)); m_varEqnp->cloneTree(true));
m_statep->m_chgFuncp->addFinalsp(initp); m_statep->m_chgFuncp->addFinalsp(initp);
EmitCBaseCounterVisitor visitor(initp);
m_statep->m_numStmts += visitor.count();
} }
virtual void visit(AstBasicDType* nodep, AstNUser*) { virtual void visit(AstBasicDType* nodep, AstNUser*) {
@@ -200,6 +246,7 @@ private:
} }
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
} }
virtual void visit(AstTopScope* nodep, AstNUser*) { virtual void visit(AstTopScope* nodep, AstNUser*) {
UINFO(4," TS "<<nodep<<endl); UINFO(4," TS "<<nodep<<endl);
// Clearing // Clearing
@@ -208,15 +255,18 @@ private:
AstScope* scopep = nodep->scopep(); AstScope* scopep = nodep->scopep();
if (!scopep) nodep->v3fatalSrc("No scope found on top level, perhaps you have no statements?\n"); if (!scopep) nodep->v3fatalSrc("No scope found on top level, perhaps you have no statements?\n");
m_statep->m_scopetopp = scopep; m_statep->m_scopetopp = scopep;
// Create change detection function
m_statep->m_chgFuncp = new AstCFunc(nodep->fileline(), "_change_request", scopep, "QData"); // Create a wrapper change detection function that calls each change detection function
m_statep->m_chgFuncp->argTypes(EmitCBaseVisitor::symClassVar()); m_statep->m_tlChgFuncp = new AstCFunc(nodep->fileline(), "_change_request", scopep, "QData");
m_statep->m_chgFuncp->symProlog(true); m_statep->m_tlChgFuncp->argTypes(EmitCBaseVisitor::symClassVar());
m_statep->m_chgFuncp->declPrivate(true); m_statep->m_tlChgFuncp->symProlog(true);
m_statep->m_scopetopp->addActivep(m_statep->m_chgFuncp); m_statep->m_tlChgFuncp->declPrivate(true);
// We need at least one change detect so we know to emit the correct code m_statep->m_scopetopp->addActivep(m_statep->m_tlChgFuncp);
// Each change detection function needs at least one AstChangeDet
// to ensure that V3EmitC outputs the necessary code.
m_statep->maybeCreateChgFuncp();
m_statep->m_chgFuncp->addStmtsp(new AstChangeDet(nodep->fileline(), NULL, NULL, false)); m_statep->m_chgFuncp->addStmtsp(new AstChangeDet(nodep->fileline(), NULL, NULL, false));
//
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
} }
virtual void visit(AstVarScope* nodep, AstNUser*) { virtual void visit(AstVarScope* nodep, AstNUser*) {
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+7 -2
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -242,6 +242,10 @@ private:
// No cleaning, or would loose pointer to enum // No cleaning, or would loose pointer to enum
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
} }
virtual void visit(AstParamTypeDType* nodep, AstNUser*) {
// No cleaning, or would loose pointer to enum
nodep->iterateChildren(*this);
}
// Control flow operators // Control flow operators
virtual void visit(AstNodeCond* nodep, AstNUser*) { virtual void visit(AstNodeCond* nodep, AstNUser*) {
@@ -269,6 +273,7 @@ private:
virtual void visit(AstCCall* nodep, AstNUser*) { virtual void visit(AstCCall* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
insureCleanAndNext (nodep->argsp()); insureCleanAndNext (nodep->argsp());
setClean (nodep, true);
} }
//-------------------- //--------------------
@@ -280,7 +285,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
CleanVisitor(AstNetlist* nodep) { explicit CleanVisitor(AstNetlist* nodep) {
nodep->accept(*this); nodep->accept(*this);
} }
virtual ~CleanVisitor() {} virtual ~CleanVisitor() {}
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+12 -12
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2008-2015 by Wilson Snyder. This program is free software; you can // Copyright 2008-2016 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.
@@ -66,7 +66,7 @@ class GaterVarVertex;
class GaterVertex : public V3GraphVertex { class GaterVertex : public V3GraphVertex {
static uint32_t s_rankNum; static uint32_t s_rankNum;
public: public:
GaterVertex(V3Graph* graphp) explicit GaterVertex(V3Graph* graphp)
: V3GraphVertex(graphp) { : V3GraphVertex(graphp) {
s_rankNum++; rank(s_rankNum); s_rankNum++; rank(s_rankNum);
} }
@@ -79,7 +79,7 @@ uint32_t GaterVertex::s_rankNum = 0;
class GaterHeadVertex : public GaterVertex { class GaterHeadVertex : public GaterVertex {
public: public:
GaterHeadVertex(V3Graph* graphp) explicit GaterHeadVertex(V3Graph* graphp)
: GaterVertex(graphp) {} : GaterVertex(graphp) {}
virtual ~GaterHeadVertex() {} virtual ~GaterHeadVertex() {}
virtual int typeNum() const { return __LINE__; } // C++ typeof() equivelent virtual int typeNum() const { return __LINE__; } // C++ typeof() equivelent
@@ -89,7 +89,7 @@ public:
class GaterPliVertex : public GaterVertex { class GaterPliVertex : public GaterVertex {
public: public:
GaterPliVertex(V3Graph* graphp) explicit GaterPliVertex(V3Graph* graphp)
: GaterVertex(graphp) {} : GaterVertex(graphp) {}
virtual ~GaterPliVertex() {} virtual ~GaterPliVertex() {}
virtual int typeNum() const { return __LINE__; } // C++ typeof() equivelent virtual int typeNum() const { return __LINE__; } // C++ typeof() equivelent
@@ -217,7 +217,7 @@ private:
} }
public: public:
// CONSTUCTORS // CONSTUCTORS
GaterCondVisitor(AstNode* nodep) { explicit GaterCondVisitor(AstNode* nodep) {
m_isSimple = true; m_isSimple = true;
nodep->accept(*this); nodep->accept(*this);
} }
@@ -296,7 +296,7 @@ class GaterBodyVisitor : public GaterBaseVisitor {
} }
if ((childstate & STATE_DELETE) && !(childstate & STATE_KEEP)) { if ((childstate & STATE_DELETE) && !(childstate & STATE_KEEP)) {
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
// Pass upwards we did delete // Pass upwards we did delete
m_state |= STATE_DELETE; m_state |= STATE_DELETE;
} else { } else {
@@ -427,7 +427,7 @@ class GaterVisitor : public GaterBaseVisitor {
for (V3GraphEdge* nextp,* edgep = m_pliVertexp->outBeginp(); edgep; edgep = nextp) { for (V3GraphEdge* nextp,* edgep = m_pliVertexp->outBeginp(); edgep; edgep = nextp) {
nextp = edgep->outNextp(); // We may edit the list nextp = edgep->outNextp(); // We may edit the list
if (GaterVarVertex* vVxp = dynamic_cast<GaterVarVertex*>(edgep->top())) { if (GaterVarVertex* vVxp = dynamic_cast<GaterVarVertex*>(edgep->top())) {
vVxp->unlinkDelete(&m_graph); vVxp=NULL; edgep=NULL; vVxp->unlinkDelete(&m_graph); VL_DANGLING(vVxp); VL_DANGLING(edgep);
} else { } else {
m_graph.dump(); m_graph.dump();
v3fatalSrc("PLI vertex points to non-signal"); v3fatalSrc("PLI vertex points to non-signal");
@@ -463,7 +463,7 @@ class GaterVisitor : public GaterBaseVisitor {
V3GraphVertex* toVxp = edgep->top(); V3GraphVertex* toVxp = edgep->top();
//UINFO(9," to "<<toVxp->user()<<" "<<toVxp<<endl); //UINFO(9," to "<<toVxp->user()<<" "<<toVxp<<endl);
if ((toVxp->user() & VU_IF) && (toVxp->user() & VU_ELSE)) { if ((toVxp->user() & VU_IF) && (toVxp->user() & VU_ELSE)) {
edgep->unlinkDelete(); edgep = NULL; edgep->unlinkDelete(); VL_DANGLING(edgep);
if (!(toVxp->user() & VU_MADE)) { // Make an edge only once if (!(toVxp->user() & VU_MADE)) { // Make an edge only once
toVxp->user(toVxp->user() | VU_MADE); toVxp->user(toVxp->user() | VU_MADE);
GaterEdge* inedgep = static_cast<GaterEdge*>(vertexp->inBeginp()); GaterEdge* inedgep = static_cast<GaterEdge*>(vertexp->inBeginp());
@@ -487,7 +487,7 @@ class GaterVisitor : public GaterBaseVisitor {
if (toVxp->user() && toVxp->user() < depth) { if (toVxp->user() && toVxp->user() < depth) {
// A recursion "above" us marked it, // A recursion "above" us marked it,
// Remove this edge, it's redundant with the upper edge // Remove this edge, it's redundant with the upper edge
edgep->unlinkDelete(); edgep=NULL; edgep->unlinkDelete(); VL_DANGLING(edgep);
} else { } else {
GaterEdge* cedgep = static_cast<GaterEdge*>(edgep); GaterEdge* cedgep = static_cast<GaterEdge*>(edgep);
if (cedgep->ifelseBoth()) { if (cedgep->ifelseBoth()) {
@@ -515,7 +515,7 @@ class GaterVisitor : public GaterBaseVisitor {
if (GaterIfVertex* toVxp = dynamic_cast<GaterIfVertex*>(edgep->top())) { if (GaterIfVertex* toVxp = dynamic_cast<GaterIfVertex*>(edgep->top())) {
if (!toVxp->outBeginp()) { if (!toVxp->outBeginp()) {
if (!nextp || nextp->top() != edgep->top()) { // Else next would disappear; we'll do it next loop if (!nextp || nextp->top() != edgep->top()) { // Else next would disappear; we'll do it next loop
toVxp->unlinkDelete(&m_graph); toVxp=NULL; edgep=NULL; toVxp->unlinkDelete(&m_graph); VL_DANGLING(toVxp); VL_DANGLING(edgep);
} }
} }
} }
@@ -529,7 +529,7 @@ class GaterVisitor : public GaterBaseVisitor {
nextp = edgep->outNextp(); // We may edit the list nextp = edgep->outNextp(); // We may edit the list
if (GaterVarVertex* toVxp = dynamic_cast<GaterVarVertex*>(edgep->top())) { if (GaterVarVertex* toVxp = dynamic_cast<GaterVarVertex*>(edgep->top())) {
if (!nextp || nextp->top() != edgep->top()) { // Else next would disappear; we'll do it next loop if (!nextp || nextp->top() != edgep->top()) { // Else next would disappear; we'll do it next loop
toVxp->unlinkDelete(&m_graph); toVxp=NULL; edgep=NULL; toVxp->unlinkDelete(&m_graph); VL_DANGLING(toVxp); VL_DANGLING(edgep);
} }
} }
} }
@@ -878,7 +878,7 @@ class GaterVisitor : public GaterBaseVisitor {
public: public:
// CONSTUCTORS // CONSTUCTORS
GaterVisitor(AstNode* nodep) { explicit GaterVisitor(AstNode* nodep) {
// AstAlways visitor does the real work, so most zeroing needs to be in clear() // AstAlways visitor does the real work, so most zeroing needs to be in clear()
clear(); clear();
nodep->accept(*this); nodep->accept(*this);
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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 -8
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -268,7 +268,7 @@ private:
stmtsp->unlinkFrBackWithNext(); stmtsp->unlinkFrBackWithNext();
cmtp->addNextHere(stmtsp); cmtp->addNextHere(stmtsp);
} }
nodep->deleteTree(); nodep = NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
virtual void visit(AstAlwaysPost* nodep, AstNUser*) { virtual void visit(AstAlwaysPost* nodep, AstNUser*) {
AstNode* cmtp = new AstComment(nodep->fileline(), nodep->typeName()); AstNode* cmtp = new AstComment(nodep->fileline(), nodep->typeName());
@@ -277,7 +277,7 @@ private:
stmtsp->unlinkFrBackWithNext(); stmtsp->unlinkFrBackWithNext();
cmtp->addNextHere(stmtsp); cmtp->addNextHere(stmtsp);
} }
nodep->deleteTree(); nodep = NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
virtual void visit(AstCoverToggle* nodep, AstNUser*) { virtual void visit(AstCoverToggle* nodep, AstNUser*) {
//nodep->dumpTree(cout,"ct:"); //nodep->dumpTree(cout,"ct:");
@@ -297,7 +297,7 @@ private:
newp->addIfsp(new AstAssign(nodep->fileline(), newp->addIfsp(new AstAssign(nodep->fileline(),
changep->cloneTree(false), changep->cloneTree(false),
origp->cloneTree(false))); origp->cloneTree(false)));
nodep->replaceWith(newp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
virtual void visit(AstInitial* nodep, AstNUser*) { virtual void visit(AstInitial* nodep, AstNUser*) {
AstNode* cmtp = new AstComment(nodep->fileline(), nodep->typeName()); AstNode* cmtp = new AstComment(nodep->fileline(), nodep->typeName());
@@ -306,7 +306,7 @@ private:
stmtsp->unlinkFrBackWithNext(); stmtsp->unlinkFrBackWithNext();
cmtp->addNextHere(stmtsp); cmtp->addNextHere(stmtsp);
} }
nodep->deleteTree(); nodep = NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
virtual void visit(AstCFunc* nodep, AstNUser*) { virtual void visit(AstCFunc* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
@@ -342,7 +342,7 @@ private:
// Not at the top or empty block... // Not at the top or empty block...
// Only empty blocks should be leftover on the non-top. Killem. // Only empty blocks should be leftover on the non-top. Killem.
if (nodep->stmtsp()) nodep->v3fatalSrc("Non-empty lower active"); if (nodep->stmtsp()) nodep->v3fatalSrc("Non-empty lower active");
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} else { } else {
UINFO(4," ACTIVE "<<nodep<<endl); UINFO(4," ACTIVE "<<nodep<<endl);
AstNode* stmtsp = nodep->stmtsp()->unlinkFrBackWithNext(); AstNode* stmtsp = nodep->stmtsp()->unlinkFrBackWithNext();
@@ -374,7 +374,7 @@ private:
// Move statements to function // Move statements to function
addToEvalLoop(stmtsp); addToEvalLoop(stmtsp);
} }
nodep->unlinkFrBack()->deleteTree(); nodep = NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} }
} }
@@ -386,7 +386,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
ClockVisitor(AstNetlist* nodep) { explicit ClockVisitor(AstNetlist* nodep) {
m_modp=NULL; m_activep=NULL; m_modp=NULL; m_activep=NULL;
m_evalFuncp = NULL; m_evalFuncp = NULL;
m_topScopep=NULL; m_topScopep=NULL;
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+9 -9
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -111,7 +111,7 @@ public:
callp->unlinkFrBack(); callp->unlinkFrBack();
} }
callp->user3(true); // Dead now callp->user3(true); // Dead now
pushDeletep(callp); callp=NULL; pushDeletep(callp); VL_DANGLING(callp);
m_callMmap.erase(eqit); // Fix the table m_callMmap.erase(eqit); // Fix the table
} }
} }
@@ -169,7 +169,7 @@ private:
} }
public: public:
// CONSTRUCTORS // CONSTRUCTORS
CombMarkVisitor(AstNode* nodep) { explicit CombMarkVisitor(AstNode* nodep) {
nodep->accept(*this); nodep->accept(*this);
} }
virtual ~CombMarkVisitor() {} virtual ~CombMarkVisitor() {}
@@ -230,7 +230,7 @@ private:
CombMarkVisitor visitor(oldfuncp); CombMarkVisitor visitor(oldfuncp);
m_call.replaceFunc(oldfuncp, NULL); m_call.replaceFunc(oldfuncp, NULL);
oldfuncp->unlinkFrBack(); oldfuncp->unlinkFrBack();
pushDeletep(oldfuncp); oldfuncp=NULL; pushDeletep(oldfuncp); VL_DANGLING(oldfuncp);
} }
} }
} }
@@ -262,7 +262,7 @@ private:
CombMarkVisitor visitor(oldfuncp); CombMarkVisitor visitor(oldfuncp);
m_call.replaceFunc(oldfuncp, newfuncp); m_call.replaceFunc(oldfuncp, newfuncp);
oldfuncp->unlinkFrBack(); oldfuncp->unlinkFrBack();
pushDeletep(oldfuncp); oldfuncp=NULL; pushDeletep(oldfuncp); VL_DANGLING(oldfuncp);
} }
void replaceOnlyCallFunc(AstCCall* nodep) { void replaceOnlyCallFunc(AstCCall* nodep) {
if (AstCFunc* oldfuncp = nodep->backp()->castCFunc()) { if (AstCFunc* oldfuncp = nodep->backp()->castCFunc()) {
@@ -274,7 +274,7 @@ private:
UINFO(9," Function only has call "<<oldfuncp<<endl); UINFO(9," Function only has call "<<oldfuncp<<endl);
m_call.deleteCall(nodep); m_call.deleteCall(nodep);
CombMarkVisitor visitor(oldfuncp); CombMarkVisitor visitor(oldfuncp);
replaceFuncWFunc(oldfuncp, nodep->funcp()); nodep=NULL; replaceFuncWFunc(oldfuncp, nodep->funcp()); VL_DANGLING(nodep);
} }
} }
} }
@@ -384,8 +384,8 @@ private:
m_call.addCall(call2p); m_call.addCall(call2p);
// If either new statement makes a func with only a single call, replace // If either new statement makes a func with only a single call, replace
// the above callers to call it directly // the above callers to call it directly
replaceOnlyCallFunc(call1p); call1p=NULL; replaceOnlyCallFunc(call1p); VL_DANGLING(call1p);
replaceOnlyCallFunc(call2p); call2p=NULL; replaceOnlyCallFunc(call2p); VL_DANGLING(call2p);
} }
// VISITORS // VISITORS
@@ -457,7 +457,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
CombineVisitor(AstNetlist* nodep) { explicit CombineVisitor(AstNetlist* nodep) {
m_modp=NULL; m_modp=NULL;
m_funcp = NULL; m_funcp = NULL;
m_state = STATE_IDLE; m_state = STATE_IDLE;
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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 -5
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2010-2015 by Wilson Snyder. This program is free software; you can // Copyright 2010-2016 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.
@@ -144,12 +144,12 @@ V3ConfigIgnores V3ConfigIgnores::s_singleton;
//###################################################################### //######################################################################
// V3Config // V3Config
void V3Config::addIgnore(V3ErrorCode code, string filename, int min, int max) { void V3Config::addIgnore(V3ErrorCode code, bool on, string filename, int min, int max) {
if (filename=="*") { if (filename=="*") {
FileLine::globalWarnOff(code,true); FileLine::globalWarnOff(code,!on);
} else { } else {
V3ConfigIgnores::singleton().addIgnore(code, filename, min, false); V3ConfigIgnores::singleton().addIgnore(code, filename, min, on);
if (max) V3ConfigIgnores::singleton().addIgnore(code, filename, max, true); if (max) V3ConfigIgnores::singleton().addIgnore(code, filename, max, !on);
} }
} }
+2 -2
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2010-2015 by Wilson Snyder. This program is free software; you can // Copyright 2010-2016 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.
@@ -30,7 +30,7 @@
class V3Config { class V3Config {
public: public:
static void addIgnore(V3ErrorCode code, string filename, int min, int max); static void addIgnore(V3ErrorCode code, bool on, string filename, int min, int max);
static void applyIgnores(FileLine* filelinep); static void applyIgnores(FileLine* filelinep);
}; };
+119 -108
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -33,6 +33,7 @@
#include <algorithm> #include <algorithm>
#include "V3Global.h" #include "V3Global.h"
#include "V3String.h"
#include "V3Const.h" #include "V3Const.h"
#include "V3Ast.h" #include "V3Ast.h"
#include "V3Width.h" #include "V3Width.h"
@@ -54,7 +55,7 @@ private:
} }
public: public:
// CONSTUCTORS // CONSTUCTORS
ConstVarMarkVisitor(AstNode* nodep) { explicit ConstVarMarkVisitor(AstNode* nodep) {
AstNode::user4ClearTree(); // Check marked InUse before we're called AstNode::user4ClearTree(); // Check marked InUse before we're called
nodep->accept(*this); nodep->accept(*this);
} }
@@ -76,7 +77,7 @@ private:
} }
public: public:
// CONSTUCTORS // CONSTUCTORS
ConstVarFindVisitor(AstNode* nodep) { explicit ConstVarFindVisitor(AstNode* nodep) {
m_found = false; m_found = false;
nodep->iterateAndNext(*this, NULL); nodep->iterateAndNext(*this, NULL);
} }
@@ -214,7 +215,7 @@ private:
if (!operandsSame(ap, bp)) return false; if (!operandsSame(ap, bp)) return false;
// Do it // Do it
cp->unlinkFrBack(); cp->unlinkFrBack();
andp->unlinkFrBack()->deleteTree(); andp=NULL; notp=NULL; andp->unlinkFrBack()->deleteTree(); VL_DANGLING(andp); VL_DANGLING(notp);
// Replace whichever branch is now dangling // Replace whichever branch is now dangling
if (nodep->rhsp()) nodep->lhsp(cp); if (nodep->rhsp()) nodep->lhsp(cp);
else nodep->rhsp(cp); else nodep->rhsp(cp);
@@ -319,7 +320,7 @@ private:
&& nodep->lsbConst()==0 && nodep->lsbConst()==0
&& (int)nodep->widthConst()==extendp->lhsp()->width() && (int)nodep->widthConst()==extendp->lhsp()->width()
)) return false; )) return false;
replaceWChild(nodep, extendp->lhsp()); nodep=NULL; replaceWChild(nodep, extendp->lhsp()); VL_DANGLING(nodep);
return true; return true;
} }
bool operandSelBiLower(AstSel* nodep) { bool operandSelBiLower(AstSel* nodep) {
@@ -338,7 +339,7 @@ private:
bip->lhsp(new AstSel(nodep->fileline(), bilhsp, 0, nodep->widthConst())); bip->lhsp(new AstSel(nodep->fileline(), bilhsp, 0, nodep->widthConst()));
bip->rhsp(new AstSel(nodep->fileline(), birhsp, 0, nodep->widthConst())); bip->rhsp(new AstSel(nodep->fileline(), birhsp, 0, nodep->widthConst()));
if (debug()>=9) bip->dumpTree(cout,"SEL(BI)-ou:"); if (debug()>=9) bip->dumpTree(cout,"SEL(BI)-ou:");
replaceWChild(nodep, bip); nodep=NULL; replaceWChild(nodep, bip); VL_DANGLING(nodep);
return true; return true;
} }
@@ -364,7 +365,7 @@ private:
V3Number num (constp->fileline(), subsize); V3Number num (constp->fileline(), subsize);
num.opAssign(constp->num()); num.opAssign(constp->num());
nodep->lhsp(new AstConst(constp->fileline(), num)); nodep->lhsp(new AstConst(constp->fileline(), num));
constp->deleteTree(); constp=NULL; constp->deleteTree(); VL_DANGLING(constp);
if (debug()>=9) nodep->dumpTree(cout,"BI(EXTEND)-ou:"); if (debug()>=9) nodep->dumpTree(cout,"BI(EXTEND)-ou:");
return true; return true;
} }
@@ -450,6 +451,8 @@ private:
if (!ifvarp || !elsevarp) return false; if (!ifvarp || !elsevarp) return false;
if (ifvarp->isWide()) return false; // Would need temporaries, so not worth it if (ifvarp->isWide()) return false; // Would need temporaries, so not worth it
if (!ifvarp->sameGateTree(elsevarp)) return false; if (!ifvarp->sameGateTree(elsevarp)) return false;
if (!ifp->rhsp()->gateTree()) return false;
if (!elsep->rhsp()->gateTree()) return false;
return true; return true;
} }
bool operandIfIf(AstNodeIf* nodep) { bool operandIfIf(AstNodeIf* nodep) {
@@ -559,58 +562,58 @@ private:
if (debug()>5) oldp->dumpTree(cout," const_old: "); if (debug()>5) oldp->dumpTree(cout," const_old: ");
if (debug()>5) newp->dumpTree(cout," _new: "); if (debug()>5) newp->dumpTree(cout," _new: ");
oldp->replaceWith(newp); oldp->replaceWith(newp);
oldp->deleteTree(); oldp=NULL; oldp->deleteTree(); VL_DANGLING(oldp);
} }
void replaceNum (AstNode* nodep, uint32_t val) { void replaceNum (AstNode* nodep, uint32_t val) {
V3Number num (nodep->fileline(), nodep->width(), val); V3Number num (nodep->fileline(), nodep->width(), val);
replaceNum(nodep, num); nodep=NULL; replaceNum(nodep, num); VL_DANGLING(nodep);
} }
void replaceNumSigned(AstNodeBiop* nodep, uint32_t val) { void replaceNumSigned(AstNodeBiop* nodep, uint32_t val) {
// We allow both sides to be constant, as one may have come from parameter propagation, etc. // We allow both sides to be constant, as one may have come from parameter propagation, etc.
if (m_warn && !(nodep->lhsp()->castConst() && nodep->rhsp()->castConst())) { if (m_warn && !(nodep->lhsp()->castConst() && nodep->rhsp()->castConst())) {
nodep->v3warn(UNSIGNED,"Comparison is constant due to unsigned arithmetic"); nodep->v3warn(UNSIGNED,"Comparison is constant due to unsigned arithmetic");
} }
replaceNum(nodep, val); nodep=NULL; replaceNum(nodep, val); VL_DANGLING(nodep);
} }
void replaceNumLimited(AstNodeBiop* nodep, uint32_t val) { void replaceNumLimited(AstNodeBiop* nodep, uint32_t val) {
// Avoids gcc warning about same // Avoids gcc warning about same
if (m_warn) nodep->v3warn(CMPCONST,"Comparison is constant due to limited range"); if (m_warn) nodep->v3warn(CMPCONST,"Comparison is constant due to limited range");
replaceNum(nodep, val); nodep=NULL; replaceNum(nodep, val); VL_DANGLING(nodep);
} }
void replaceZero(AstNode* nodep) { void replaceZero(AstNode* nodep) {
replaceNum(nodep, 0); nodep=NULL; replaceNum(nodep, 0); VL_DANGLING(nodep);
} }
void replaceZeroChkPure(AstNode* nodep, AstNode* checkp) { void replaceZeroChkPure(AstNode* nodep, AstNode* checkp) {
// For example, "0 * n" -> 0 if n has no side effects // For example, "0 * n" -> 0 if n has no side effects
// Else strength reduce it to 0 & n. // Else strength reduce it to 0 & n.
// If ever change the operation note AstAnd rule specially ignores this created pattern // If ever change the operation note AstAnd rule specially ignores this created pattern
if (isTPure(checkp)) { if (isTPure(checkp)) {
replaceNum(nodep, 0); nodep=NULL; replaceNum(nodep, 0); VL_DANGLING(nodep);
} else { } else {
AstNode* newp = new AstAnd(nodep->fileline(), AstNode* newp = new AstAnd(nodep->fileline(),
new AstConst(nodep->fileline(), 0), new AstConst(nodep->fileline(), 0),
checkp->unlinkFrBack()); checkp->unlinkFrBack());
newp->dtypeFrom(nodep); newp->dtypeFrom(nodep);
nodep->replaceWith(newp); nodep->replaceWith(newp);
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
} }
void replaceAllOnes (AstNode* nodep) { void replaceAllOnes (AstNode* nodep) {
V3Number ones (nodep->fileline(), nodep->width(), 0); V3Number ones (nodep->fileline(), nodep->width(), 0);
ones.setMask(nodep->width()); ones.setMask(nodep->width());
replaceNum(nodep, ones); nodep=NULL; replaceNum(nodep, ones); VL_DANGLING(nodep);
} }
void replaceConst(AstNodeUniop* nodep) { void replaceConst(AstNodeUniop* nodep) {
V3Number num (nodep->fileline(), nodep->width()); V3Number num (nodep->fileline(), nodep->width());
nodep->numberOperate(num, nodep->lhsp()->castConst()->num()); nodep->numberOperate(num, nodep->lhsp()->castConst()->num());
UINFO(4,"UNICONST -> "<<num<<endl); UINFO(4,"UNICONST -> "<<num<<endl);
replaceNum(nodep, num); nodep=NULL; replaceNum(nodep, num); VL_DANGLING(nodep);
} }
void replaceConst(AstNodeBiop* nodep) { void replaceConst(AstNodeBiop* nodep) {
V3Number num (nodep->fileline(), nodep->width()); V3Number num (nodep->fileline(), nodep->width());
nodep->numberOperate(num, nodep->lhsp()->castConst()->num(), nodep->rhsp()->castConst()->num()); nodep->numberOperate(num, nodep->lhsp()->castConst()->num(), nodep->rhsp()->castConst()->num());
UINFO(4,"BICONST -> "<<num<<endl); UINFO(4,"BICONST -> "<<num<<endl);
replaceNum(nodep, num); nodep=NULL; replaceNum(nodep, num); VL_DANGLING(nodep);
} }
void replaceConst(AstNodeTriop* nodep) { void replaceConst(AstNodeTriop* nodep) {
V3Number num (nodep->fileline(), nodep->width()); V3Number num (nodep->fileline(), nodep->width());
@@ -618,7 +621,7 @@ private:
nodep->rhsp()->castConst()->num(), nodep->rhsp()->castConst()->num(),
nodep->thsp()->castConst()->num()); nodep->thsp()->castConst()->num());
UINFO(4,"TRICONST -> "<<num<<endl); UINFO(4,"TRICONST -> "<<num<<endl);
replaceNum(nodep, num); nodep=NULL; replaceNum(nodep, num); VL_DANGLING(nodep);
} }
void replaceConstString (AstNode* oldp, const string& num) { void replaceConstString (AstNode* oldp, const string& num) {
@@ -628,7 +631,7 @@ private:
if (debug()>5) oldp->dumpTree(cout," const_old: "); if (debug()>5) oldp->dumpTree(cout," const_old: ");
if (debug()>5) newp->dumpTree(cout," _new: "); if (debug()>5) newp->dumpTree(cout," _new: ");
oldp->replaceWith(newp); oldp->replaceWith(newp);
oldp->deleteTree(); oldp=NULL; oldp->deleteTree(); VL_DANGLING(oldp);
} }
//---------------------------------------- //----------------------------------------
// Replacement functions. // Replacement functions.
@@ -641,7 +644,7 @@ private:
// This may adversly affect the operation of the node being replaced. // This may adversly affect the operation of the node being replaced.
childp->dtypeFrom(nodep); childp->dtypeFrom(nodep);
nodep->replaceWith(childp); nodep->replaceWith(childp);
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
//! Replace a ternary node with its RHS after iterating //! Replace a ternary node with its RHS after iterating
@@ -775,9 +778,9 @@ private:
UINFO(5, "merged two adjacent sel "<<lselp <<" and "<<rselp<< " to one "<<newselp<<endl); UINFO(5, "merged two adjacent sel "<<lselp <<" and "<<rselp<< " to one "<<newselp<<endl);
nodep->replaceWith(newselp); nodep->replaceWith(newselp);
lselp->deleteTree(); lselp = NULL; lselp->deleteTree(); VL_DANGLING(lselp);
rselp->deleteTree(); rselp = NULL; rselp->deleteTree(); VL_DANGLING(rselp);
nodep->deleteTree(); nodep = NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceConcatMerge(AstConcat* nodep) { void replaceConcatMerge(AstConcat* nodep) {
AstNodeBiop* lp = nodep->lhsp()->castNodeBiop(); AstNodeBiop* lp = nodep->lhsp()->castNodeBiop();
@@ -794,8 +797,8 @@ private:
lp->rhsp()->replaceWith(newrp); lp->rhsp()->replaceWith(newrp);
lp->dtypeChgWidthSigned(newlp->width(), newlp->width(), AstNumeric::fromBool(true)); lp->dtypeChgWidthSigned(newlp->width(), newlp->width(), AstNumeric::fromBool(true));
UINFO(5, "merged "<< nodep <<endl); UINFO(5, "merged "<< nodep <<endl);
rp->unlinkFrBack()->deleteTree(); rp = NULL; rp->unlinkFrBack()->deleteTree(); VL_DANGLING(rp);
nodep->replaceWith(lp->unlinkFrBack()); nodep->deleteTree(); nodep = NULL; nodep->replaceWith(lp->unlinkFrBack()); nodep->deleteTree(); VL_DANGLING(nodep);
lp->lhsp()->accept(*this); lp->lhsp()->accept(*this);
lp->rhsp()->accept(*this); lp->rhsp()->accept(*this);
} else nodep->v3fatalSrc("tried to merge two Concat which are not adjacent"); } else nodep->v3fatalSrc("tried to merge two Concat which are not adjacent");
@@ -808,7 +811,7 @@ private:
? (new AstExtendS(nodep->fileline(), arg0p))->castNode() ? (new AstExtendS(nodep->fileline(), arg0p))->castNode()
: (new AstExtend (nodep->fileline(), arg0p))->castNode()); : (new AstExtend (nodep->fileline(), arg0p))->castNode());
newp->dtypeFrom(nodep); newp->dtypeFrom(nodep);
nodep->replaceWith(newp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replacePowShift (AstNodeBiop* nodep) { // Pow or PowS void replacePowShift (AstNodeBiop* nodep) { // Pow or PowS
UINFO(5,"POW(2,b)->SHIFTL(1,b) "<<nodep<<endl); UINFO(5,"POW(2,b)->SHIFTL(1,b) "<<nodep<<endl);
@@ -818,7 +821,7 @@ private:
rhsp); rhsp);
newp->dtypeFrom(nodep); newp->dtypeFrom(nodep);
newp->lhsp()->dtypeFrom(nodep); newp->lhsp()->dtypeFrom(nodep);
nodep->replaceWith(newp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceMulShift (AstMul* nodep) { // Mul, but not MulS as not simple shift void replaceMulShift (AstMul* nodep) { // Mul, but not MulS as not simple shift
UINFO(5,"MUL(2^n,b)->SHIFTL(b,n) "<<nodep<<endl); UINFO(5,"MUL(2^n,b)->SHIFTL(b,n) "<<nodep<<endl);
@@ -827,7 +830,7 @@ private:
AstShiftL* newp = new AstShiftL(nodep->fileline(), AstShiftL* newp = new AstShiftL(nodep->fileline(),
opp, new AstConst(nodep->fileline(), amount)); opp, new AstConst(nodep->fileline(), amount));
newp->dtypeFrom(nodep); newp->dtypeFrom(nodep);
nodep->replaceWith(newp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceDivShift (AstDiv* nodep) { // Mul, but not MulS as not simple shift void replaceDivShift (AstDiv* nodep) { // Mul, but not MulS as not simple shift
UINFO(5,"DIV(b,2^n)->SHIFTR(b,n) "<<nodep<<endl); UINFO(5,"DIV(b,2^n)->SHIFTR(b,n) "<<nodep<<endl);
@@ -836,7 +839,7 @@ private:
AstShiftR* newp = new AstShiftR(nodep->fileline(), AstShiftR* newp = new AstShiftR(nodep->fileline(),
opp, new AstConst(nodep->fileline(), amount)); opp, new AstConst(nodep->fileline(), amount));
newp->dtypeFrom(nodep); newp->dtypeFrom(nodep);
nodep->replaceWith(newp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceShiftOp (AstNodeBiop* nodep) { void replaceShiftOp (AstNodeBiop* nodep) {
UINFO(5,"SHIFT(AND(a,b),CONST)->AND(SHIFT(a,CONST),SHIFT(b,CONST)) "<<nodep<<endl); UINFO(5,"SHIFT(AND(a,b),CONST)->AND(SHIFT(a,CONST),SHIFT(b,CONST)) "<<nodep<<endl);
@@ -867,8 +870,8 @@ private:
int shift1 = shift1p->castConst()->toUInt(); int shift1 = shift1p->castConst()->toUInt();
int shift2 = shift2p->castConst()->toUInt(); int shift2 = shift2p->castConst()->toUInt();
int newshift = shift1+shift2; int newshift = shift1+shift2;
shift1p->deleteTree(); shift1p=NULL; shift1p->deleteTree(); VL_DANGLING(shift1p);
shift2p->deleteTree(); shift2p=NULL; shift2p->deleteTree(); VL_DANGLING(shift2p);
nodep->lhsp(ap); nodep->lhsp(ap);
nodep->rhsp(new AstConst(nodep->fileline(), newshift)); nodep->rhsp(new AstConst(nodep->fileline(), newshift));
nodep->accept(*this); // Further reduce, either node may have more reductions. nodep->accept(*this); // Further reduce, either node may have more reductions.
@@ -877,8 +880,8 @@ private:
int shift1 = shift1p->castConst()->toUInt(); if (lhsp->castShiftR()) shift1=-shift1; int shift1 = shift1p->castConst()->toUInt(); if (lhsp->castShiftR()) shift1=-shift1;
int shift2 = shift2p->castConst()->toUInt(); if (nodep->castShiftR()) shift2=-shift2; int shift2 = shift2p->castConst()->toUInt(); if (nodep->castShiftR()) shift2=-shift2;
int newshift = shift1+shift2; int newshift = shift1+shift2;
shift1p->deleteTree(); shift1p=NULL; shift1p->deleteTree(); VL_DANGLING(shift1p);
shift2p->deleteTree(); shift2p=NULL; shift2p->deleteTree(); VL_DANGLING(shift2p);
AstNode* newp; AstNode* newp;
V3Number mask1 (nodep->fileline(), nodep->width()); V3Number mask1 (nodep->fileline(), nodep->width());
V3Number ones (nodep->fileline(), nodep->width()); V3Number ones (nodep->fileline(), nodep->width());
@@ -906,11 +909,11 @@ private:
newp, newp,
new AstConst (nodep->fileline(), mask)); new AstConst (nodep->fileline(), mask));
newp->dtypeFrom(nodep); newp->dtypeFrom(nodep);
nodep->replaceWith(newp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newp); nodep->deleteTree(); VL_DANGLING(nodep);
//newp->dumpTree(cout, " repShiftShift_new: "); //newp->dumpTree(cout, " repShiftShift_new: ");
newp->accept(*this); // Further reduce, either node may have more reductions. newp->accept(*this); // Further reduce, either node may have more reductions.
} }
lhsp->deleteTree(); lhsp=NULL; lhsp->deleteTree(); VL_DANGLING(lhsp);
} }
bool replaceAssignMultiSel(AstNodeAssign* nodep) { bool replaceAssignMultiSel(AstNodeAssign* nodep) {
@@ -983,7 +986,7 @@ private:
nodep->v3error("Wire inputs its own output, creating circular logic (wire x=x)"); nodep->v3error("Wire inputs its own output, creating circular logic (wire x=x)");
return false; // Don't delete the assign, or V3Gate will freak out return false; // Don't delete the assign, or V3Gate will freak out
} else { } else {
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
return true; return true;
} }
} }
@@ -1034,10 +1037,8 @@ private:
AstNodeAssign* asn2ap=nodep->cloneType(lc2p, sel2p)->castNodeAssign(); AstNodeAssign* asn2ap=nodep->cloneType(lc2p, sel2p)->castNodeAssign();
asn1ap->dtypeFrom(sel1p); asn1ap->dtypeFrom(sel1p);
asn2ap->dtypeFrom(sel2p); asn2ap->dtypeFrom(sel2p);
// cppcheck-suppress nullPointer // addNext deals with it newp = AstNode::addNext(newp, asn1ap);
newp = newp->addNext(asn1ap); newp = AstNode::addNext(newp, asn2ap);
// cppcheck-suppress nullPointer // addNext deals with it
newp = newp->addNext(asn2ap);
} else { } else {
if (!m_modp) nodep->v3fatalSrc("Not under module"); if (!m_modp) nodep->v3fatalSrc("Not under module");
// We could create just one temp variable, but we'll get better optimization // We could create just one temp variable, but we'll get better optimization
@@ -1067,20 +1068,16 @@ private:
asn2ap->dtypeFrom(temp2p); asn2ap->dtypeFrom(temp2p);
asn2bp->dtypeFrom(temp2p); asn2bp->dtypeFrom(temp2p);
// This order matters // This order matters
// cppcheck-suppress nullPointer // addNext deals with it newp = AstNode::addNext(newp, asn1ap);
newp = newp->addNext(asn1ap); newp = AstNode::addNext(newp, asn2ap);
// cppcheck-suppress nullPointer // addNext deals with it newp = AstNode::addNext(newp, asn1bp);
newp = newp->addNext(asn2ap); newp = AstNode::addNext(newp, asn2bp);
// cppcheck-suppress nullPointer // addNext deals with it
newp = newp->addNext(asn1bp);
// cppcheck-suppress nullPointer // addNext deals with it
newp = newp->addNext(asn2bp);
} }
if (debug()>=9 && newp) newp->dumpTreeAndNext(cout," _new: "); if (debug()>=9 && newp) newp->dumpTreeAndNext(cout," _new: ");
nodep->addNextHere(newp); nodep->addNextHere(newp);
// Cleanup // Cleanup
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
conp->deleteTree(); conp=NULL; conp->deleteTree(); VL_DANGLING(conp);
// Further reduce, either node may have more reductions. // Further reduce, either node may have more reductions.
return true; return true;
} }
@@ -1093,8 +1090,8 @@ private:
AstNode* streamp = nodep->rhsp()->castStreamR()->unlinkFrBack(); AstNode* streamp = nodep->rhsp()->castStreamR()->unlinkFrBack();
nodep->rhsp(srcp); nodep->rhsp(srcp);
// Cleanup // Cleanup
sizep->deleteTree(); sizep=NULL; sizep->deleteTree(); VL_DANGLING(sizep);
streamp->deleteTree(); streamp=NULL; streamp->deleteTree(); VL_DANGLING(streamp);
// Further reduce, any of the nodes may have more reductions. // Further reduce, any of the nodes may have more reductions.
return true; return true;
} }
@@ -1137,8 +1134,8 @@ private:
nodep->lhsp(dstp); nodep->lhsp(dstp);
nodep->rhsp(srcp); nodep->rhsp(srcp);
// Cleanup // Cleanup
sizep->deleteTree(); sizep=NULL; sizep->deleteTree(); VL_DANGLING(sizep);
streamp->deleteTree(); streamp=NULL; streamp->deleteTree(); VL_DANGLING(streamp);
// Further reduce, any of the nodes may have more reductions. // Further reduce, any of the nodes may have more reductions.
return true; return true;
} }
@@ -1171,7 +1168,7 @@ private:
fromp); fromp);
newp->dtypeSetLogicSized(nodep->width(), nodep->width(), AstNumeric::UNSIGNED); // widthMin no longer applicable if different C-expanded width newp->dtypeSetLogicSized(nodep->width(), nodep->width(), AstNumeric::UNSIGNED); // widthMin no longer applicable if different C-expanded width
nodep->replaceWith(newp); nodep->replaceWith(newp);
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
if (debug()>=9) newp->dumpTree(cout," _new: "); if (debug()>=9) newp->dumpTree(cout," _new: ");
} }
@@ -1185,13 +1182,13 @@ private:
<<nodep->prettyTypeName()<<endl <<nodep->prettyTypeName()<<endl
<<errorp->warnMore()<<"... Location of non-constant " <<errorp->warnMore()<<"... Location of non-constant "
<<errorp->prettyTypeName()<<": "<<simvis.whyNotMessage()); <<errorp->prettyTypeName()<<": "<<simvis.whyNotMessage());
replaceZero(nodep); nodep=NULL; replaceZero(nodep); VL_DANGLING(nodep);
} else { } else {
// Fetch the result // Fetch the result
V3Number* outnump = simvis.fetchNumberNull(nodep); V3Number* outnump = simvis.fetchNumberNull(nodep);
if (!outnump) nodep->v3fatalSrc("No number returned from simulation"); if (!outnump) nodep->v3fatalSrc("No number returned from simulation");
// Replace it // Replace it
replaceNum(nodep,*outnump); nodep=NULL; replaceNum(nodep,*outnump); VL_DANGLING(nodep);
} }
} }
@@ -1271,7 +1268,7 @@ private:
// If bp was a concat, then we have this exact same form again! // If bp was a concat, then we have this exact same form again!
// Recurse rather then calling node->iterate to prevent 2^n recursion! // Recurse rather then calling node->iterate to prevent 2^n recursion!
if (operandConcatMove(abConcp)) moveConcat(abConcp); if (operandConcatMove(abConcp)) moveConcat(abConcp);
bcConcp->deleteTree(); bcConcp=NULL; bcConcp->deleteTree(); VL_DANGLING(bcConcp);
} else { } else {
AstConcat* abConcp = nodep->lhsp()->castConcat(); abConcp->unlinkFrBack(); AstConcat* abConcp = nodep->lhsp()->castConcat(); abConcp->unlinkFrBack();
AstNode* ap = abConcp->lhsp()->unlinkFrBack(); AstNode* ap = abConcp->lhsp()->unlinkFrBack();
@@ -1282,7 +1279,7 @@ private:
nodep->lhsp(ap); nodep->lhsp(ap);
nodep->rhsp(bcConcp); nodep->rhsp(bcConcp);
if (operandConcatMove(bcConcp)) moveConcat(bcConcp); if (operandConcatMove(bcConcp)) moveConcat(bcConcp);
abConcp->deleteTree(); abConcp=NULL; abConcp->deleteTree(); VL_DANGLING(abConcp);
} }
} }
@@ -1313,8 +1310,8 @@ private:
if (lsb1p->castConst() && lsb2p->castConst()) { if (lsb1p->castConst() && lsb2p->castConst()) {
newlsbp = new AstConst(lsb1p->fileline(), newlsbp = new AstConst(lsb1p->fileline(),
lsb1p->castConst()->toUInt() + lsb2p->castConst()->toUInt()); lsb1p->castConst()->toUInt() + lsb2p->castConst()->toUInt());
lsb1p->deleteTree(); lsb1p=NULL; lsb1p->deleteTree(); VL_DANGLING(lsb1p);
lsb2p->deleteTree(); lsb2p=NULL; lsb2p->deleteTree(); VL_DANGLING(lsb2p);
} else { } else {
// Width is important, we need the width of the fromp's // Width is important, we need the width of the fromp's
// expression, not the potentially smaller lsb1p's width // expression, not the potentially smaller lsb1p's width
@@ -1328,7 +1325,7 @@ private:
newlsbp, newlsbp,
widthp); widthp);
nodep->replaceWith(newp); nodep->replaceWith(newp);
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceSelConcat(AstSel* nodep) { void replaceSelConcat(AstSel* nodep) {
@@ -1368,7 +1365,7 @@ private:
conRhsp->width()-nodep->lsbConst())); conRhsp->width()-nodep->lsbConst()));
nodep->replaceWith(newp); nodep->replaceWith(newp);
} }
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceSelReplicate(AstSel* nodep) { void replaceSelReplicate(AstSel* nodep) {
@@ -1382,7 +1379,7 @@ private:
new AstConst(lsbp->fileline(), lsbp->toUInt() % fromp->width()), new AstConst(lsbp->fileline(), lsbp->toUInt() % fromp->width()),
widthp); widthp);
newp->dtypeFrom(nodep); newp->dtypeFrom(nodep);
nodep->replaceWith(newp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceSelIntoBiop(AstSel* nodep) { void replaceSelIntoBiop(AstSel* nodep) {
@@ -1400,7 +1397,7 @@ private:
fromp->rhsp(new AstSel(nodep->fileline(), fromp->rhsp(new AstSel(nodep->fileline(),
birhsp, lsbp, widthp)); birhsp, lsbp, widthp));
fromp->dtypeFrom(nodep); fromp->dtypeFrom(nodep);
nodep->replaceWith(fromp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(fromp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
void replaceSelIntoUniop(AstSel* nodep) { void replaceSelIntoUniop(AstSel* nodep) {
// SEL(NOT(a),1,bit) => NOT(SEL(a,bit)) // SEL(NOT(a),1,bit) => NOT(SEL(a,bit))
@@ -1414,7 +1411,7 @@ private:
fromp->lhsp(new AstSel(nodep->fileline(), fromp->lhsp(new AstSel(nodep->fileline(),
bilhsp, lsbp, widthp)); bilhsp, lsbp, widthp));
fromp->dtypeFrom(nodep); fromp->dtypeFrom(nodep);
nodep->replaceWith(fromp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(fromp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
virtual void visit(AstAttrOf* nodep, AstNUser*) { virtual void visit(AstAttrOf* nodep, AstNUser*) {
@@ -1443,7 +1440,7 @@ private:
} }
m_selp = NULL; m_selp = NULL;
} }
virtual void visit(AstVarRef* nodep, AstNUser*) { virtual void visit(AstNodeVarRef* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
if (!nodep->varp()) nodep->v3fatalSrc("Not linked"); if (!nodep->varp()) nodep->v3fatalSrc("Not linked");
bool did=false; bool did=false;
@@ -1463,17 +1460,29 @@ private:
if (operandConst(valuep)) { if (operandConst(valuep)) {
const V3Number& num = valuep->castConst()->num(); const V3Number& num = valuep->castConst()->num();
//UINFO(2,"constVisit "<<(void*)valuep<<" "<<num<<endl); //UINFO(2,"constVisit "<<(void*)valuep<<" "<<num<<endl);
replaceNum(nodep, num); nodep=NULL; replaceNum(nodep, num); VL_DANGLING(nodep);
did=true; did=true;
} }
else if (m_selp && valuep->castInitArray()) { else if (m_selp && valuep->castInitArray()) {
int bit = m_selp->bitConst(); AstInitArray* initarp = valuep->castInitArray();
AstNode* itemp = valuep->castInitArray()->initsp(); uint32_t bit = m_selp->bitConst();
for (int n=0; n<bit && itemp; ++n, itemp=itemp->nextp()) {} int pos = 0;
AstNode* itemp = initarp->initsp();
for (; itemp; ++pos, itemp=itemp->nextp()) {
uint32_t index = initarp->posIndex(pos);
if (index == bit) break;
if (index > bit) {
if (initarp->defaultp()) {
itemp = initarp->defaultp();
} else {
initarp->v3fatalSrc("Not enough values in array initalizement");
}
}
}
if (itemp->castConst()) { if (itemp->castConst()) {
const V3Number& num = itemp->castConst()->num(); const V3Number& num = itemp->castConst()->num();
//UINFO(2,"constVisit "<<(void*)valuep<<" "<<num<<endl); //UINFO(2,"constVisit "<<(void*)valuep<<" "<<num<<endl);
replaceNum(nodep, num); nodep=NULL; replaceNum(nodep, num); VL_DANGLING(nodep);
did=true; did=true;
} }
} }
@@ -1492,7 +1501,7 @@ private:
nodep->itemp()->valuep()->iterateAndNext(*this); nodep->itemp()->valuep()->iterateAndNext(*this);
if (AstConst* valuep = nodep->itemp()->valuep()->castConst()) { if (AstConst* valuep = nodep->itemp()->valuep()->castConst()) {
const V3Number& num = valuep->num(); const V3Number& num = valuep->num();
replaceNum(nodep, num); nodep=NULL; replaceNum(nodep, num); VL_DANGLING(nodep);
did=true; did=true;
} }
} }
@@ -1519,13 +1528,13 @@ private:
if (nodep->isClocked()) { // A constant can never get a pos/negexge if (nodep->isClocked()) { // A constant can never get a pos/negexge
if (onlySenItemInSenTree(nodep)) { if (onlySenItemInSenTree(nodep)) {
nodep->replaceWith(new AstSenItem(nodep->fileline(), AstSenItem::Never())); nodep->replaceWith(new AstSenItem(nodep->fileline(), AstSenItem::Never()));
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} else { } else {
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} }
} else { // Otherwise it may compute a result that needs to settle out } else { // Otherwise it may compute a result that needs to settle out
nodep->replaceWith(new AstSenItem(nodep->fileline(), AstSenItem::Combo())); nodep->replaceWith(new AstSenItem(nodep->fileline(), AstSenItem::Combo()));
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
} else if (m_doNConst && nodep->sensp()->castNot()) { } else if (m_doNConst && nodep->sensp()->castNot()) {
// V3Gate may propagate NOTs into clocks... Just deal with it // V3Gate may propagate NOTs into clocks... Just deal with it
@@ -1541,7 +1550,7 @@ private:
AstNodeVarRef* senvarp = lastSensp->unlinkFrBack()->castNodeVarRef(); AstNodeVarRef* senvarp = lastSensp->unlinkFrBack()->castNodeVarRef();
if (!senvarp) sensp->v3fatalSrc("Non-varref sensitivity variable"); if (!senvarp) sensp->v3fatalSrc("Non-varref sensitivity variable");
sensp->replaceWith(senvarp); sensp->replaceWith(senvarp);
sensp->deleteTree(); sensp=NULL; sensp->deleteTree(); VL_DANGLING(sensp);
} else if (!m_doNConst // Deal with later when doNConst missing } else if (!m_doNConst // Deal with later when doNConst missing
&& (nodep->sensp()->castEnumItemRef() && (nodep->sensp()->castEnumItemRef()
|| nodep->sensp()->castConst())) { || nodep->sensp()->castConst())) {
@@ -1556,15 +1565,15 @@ private:
UINFO(4,"SENGATE(...,0)->NEVER"<<endl); UINFO(4,"SENGATE(...,0)->NEVER"<<endl);
if (onlySenItemInSenTree(nodep)) { if (onlySenItemInSenTree(nodep)) {
nodep->replaceWith(new AstSenItem(nodep->fileline(), AstSenItem::Never())); nodep->replaceWith(new AstSenItem(nodep->fileline(), AstSenItem::Never()));
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} else { } else {
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} }
} else { } else {
UINFO(4,"SENGATE(SENITEM,0)->ALWAYS SENITEM"<<endl); UINFO(4,"SENGATE(SENITEM,0)->ALWAYS SENITEM"<<endl);
AstNode* senitemp = nodep->sensesp()->unlinkFrBack(); AstNode* senitemp = nodep->sensesp()->unlinkFrBack();
nodep->replaceWith(senitemp); nodep->replaceWith(senitemp);
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
} }
} }
@@ -1630,7 +1639,7 @@ private:
// Found, push this item up to the top // Found, push this item up to the top
itemp->unlinkFrBack(); itemp->unlinkFrBack();
nodep->addSensesp(itemp); nodep->addSensesp(itemp);
gatep->unlinkFrBack()->deleteTree(); gatep=NULL; senp=NULL; gatep->unlinkFrBack()->deleteTree(); VL_DANGLING(gatep); VL_DANGLING(senp);
} }
} }
} }
@@ -1686,7 +1695,7 @@ private:
&& ritemp->edgeType()==AstEdgeType::ET_NEGEDGE) && ritemp->edgeType()==AstEdgeType::ET_NEGEDGE)
litemp->edgeType(AstEdgeType::ET_BOTHEDGE); litemp->edgeType(AstEdgeType::ET_BOTHEDGE);
// Remove redundant node // Remove redundant node
ritemp->unlinkFrBack()->deleteTree(); ritemp=NULL; cmpp=NULL; ritemp->unlinkFrBack()->deleteTree(); VL_DANGLING(ritemp); VL_DANGLING(cmpp);
// Try to collapse again // Try to collapse again
nextp=litemp; nextp=litemp;
} }
@@ -1729,7 +1738,7 @@ private:
new AstAssign(nodep->fileline(), new AstAssign(nodep->fileline(),
varrefp, exprp)); varrefp, exprp));
m_modp->addStmtp(newinitp); m_modp->addStmtp(newinitp);
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
// Set the initial value right in the variable so we can constant propagate // Set the initial value right in the variable so we can constant propagate
AstNode* initvaluep = exprp->cloneTree(false); AstNode* initvaluep = exprp->cloneTree(false);
varrefp->varp()->valuep(initvaluep); varrefp->varp()->valuep(initvaluep);
@@ -1754,12 +1763,12 @@ private:
} else { } else {
nodep->unlinkFrBack(); nodep->unlinkFrBack();
} }
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
else if (!afterComment(nodep->ifsp()) && !afterComment(nodep->elsesp())) { else if (!afterComment(nodep->ifsp()) && !afterComment(nodep->elsesp())) {
// Empty block, remove it // Empty block, remove it
// Note if we support more C++ then there might be side effects in the condition itself // Note if we support more C++ then there might be side effects in the condition itself
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} }
else if (!afterComment(nodep->ifsp())) { else if (!afterComment(nodep->ifsp())) {
UINFO(4,"IF({x}) NULL {...} => IF(NOT{x}}: "<<nodep<<endl); UINFO(4,"IF({x}) NULL {...} => IF(NOT{x}}: "<<nodep<<endl);
@@ -1781,7 +1790,7 @@ private:
AstIf* ifp = new AstIf(nodep->fileline(), condp, elsesp, ifsp); AstIf* ifp = new AstIf(nodep->fileline(), condp, elsesp, ifsp);
ifp->branchPred(nodep->branchPred().invert()); ifp->branchPred(nodep->branchPred().invert());
nodep->replaceWith(ifp); nodep->replaceWith(ifp);
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
else if (ifSameAssign(nodep)) { else if (ifSameAssign(nodep)) {
UINFO(4,"IF({a}) ASSIGN({b},{c}) else ASSIGN({b},{d}) => ASSIGN({b}, {a}?{c}:{d})"<<endl); UINFO(4,"IF({a}) ASSIGN({b},{c}) else ASSIGN({b},{d}) => ASSIGN({b}, {a}?{c}:{d})"<<endl);
@@ -1794,7 +1803,7 @@ private:
ifp->rhsp(new AstCond(truep->fileline(), ifp->rhsp(new AstCond(truep->fileline(),
condp, truep, falsep)); condp, truep, falsep));
nodep->replaceWith(ifp); nodep->replaceWith(ifp);
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
else if (0 // Disabled, as vpm assertions are faster without due to short-circuiting else if (0 // Disabled, as vpm assertions are faster without due to short-circuiting
&& operandIfIf(nodep)) { && operandIfIf(nodep)) {
@@ -1806,7 +1815,7 @@ private:
nodep->condp(new AstLogAnd(lowerIfp->fileline(), nodep->condp(new AstLogAnd(lowerIfp->fileline(),
condp, lowerCondp)); condp, lowerCondp));
lowerIfp->replaceWith(lowerIfsp); lowerIfp->replaceWith(lowerIfsp);
lowerIfp->deleteTree(); lowerIfp=NULL; lowerIfp->deleteTree(); VL_DANGLING(lowerIfp);
} }
else if (operandBoolShift(nodep->condp())) { else if (operandBoolShift(nodep->condp())) {
replaceBoolShift(nodep->condp()); replaceBoolShift(nodep->condp());
@@ -1825,7 +1834,7 @@ private:
} }
if (m_doNConst && anyconst) { if (m_doNConst && anyconst) {
//UINFO(9," Display in "<<nodep->text()<<endl); //UINFO(9," Display in "<<nodep->text()<<endl);
string dispout = ""; string newFormat = "";
string fmt = ""; string fmt = "";
bool inPct = false; bool inPct = false;
AstNode* argp = nodep->exprsp(); AstNode* argp = nodep->exprsp();
@@ -1843,38 +1852,36 @@ private:
switch (tolower(ch)) { switch (tolower(ch)) {
case '%': break; // %% - just output a % case '%': break; // %% - just output a %
case 'm': break; // %m - auto insert "name" case 'm': break; // %m - auto insert "name"
case 'l': break; // %l - auto insert "library"
default: // Most operators, just move to next argument default: // Most operators, just move to next argument
if (argp) { if (argp) {
AstNode* nextp=argp->nextp(); AstNode* nextp=argp->nextp();
if (argp && argp->castConst()) { // Convert it if (argp && argp->castConst()) { // Convert it
string out = argp->castConst()->num().displayed(fmt); string out = argp->castConst()->num().displayed(nodep->fileline(), fmt);
UINFO(9," DispConst: "<<fmt<<" -> "<<out<<" for "<<argp<<endl); UINFO(9," DispConst: "<<fmt<<" -> "<<out<<" for "<<argp<<endl);
{ // fmt = out w/ replace % with %% as it must be literal. // fmt = out w/ replace % with %% as it must be literal.
fmt = ""; fmt = VString::quotePercent(out);
for (string::iterator pos = out.begin(); pos != out.end(); ++pos) {
if (*pos == '%') fmt += '%';
fmt += *pos;
}
}
argp->unlinkFrBack()->deleteTree(); argp->unlinkFrBack()->deleteTree();
} }
argp=nextp; argp=nextp;
} }
break; break;
} // switch } // switch
dispout += fmt; newFormat += fmt;
} else { } else {
dispout += ch; newFormat += ch;
} }
} }
nodep->text(dispout); if (newFormat != nodep->text()) {
//UINFO(9," Display out "<<nodep->text()<<endl); nodep->text(newFormat);
UINFO(9," Display out "<<nodep<<endl);
}
} }
if (!nodep->exprsp() if (!nodep->exprsp()
&& nodep->name().find("%") == string::npos && nodep->name().find("%") == string::npos
&& !nodep->hidden()) { && !nodep->hidden()) {
// Just a simple constant string - the formatting is pointless // Just a simple constant string - the formatting is pointless
replaceConstString(nodep, nodep->name()); nodep=NULL; replaceConstString(nodep, nodep->name()); VL_DANGLING(nodep);
} }
} }
@@ -1895,7 +1902,7 @@ private:
UINFO(4,"WHILE(0) => nop "<<nodep<<endl); UINFO(4,"WHILE(0) => nop "<<nodep<<endl);
if (nodep->precondsp()) nodep->replaceWith(nodep->precondsp()); if (nodep->precondsp()) nodep->replaceWith(nodep->precondsp());
else nodep->unlinkFrBack(); else nodep->unlinkFrBack();
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
else if (operandBoolShift(nodep->condp())) { else if (operandBoolShift(nodep->condp())) {
replaceBoolShift(nodep->condp()); replaceBoolShift(nodep->condp());
@@ -1915,7 +1922,7 @@ private:
virtual void visit(AstSysIgnore* nodep, AstNUser*) { virtual void visit(AstSysIgnore* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
if (m_doNConst) { if (m_doNConst) {
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} }
} }
@@ -1945,7 +1952,7 @@ private:
if (nodep->stmtsp()) underp = nodep->stmtsp()->unlinkFrBackWithNext(); if (nodep->stmtsp()) underp = nodep->stmtsp()->unlinkFrBackWithNext();
if (underp) nodep->replaceWith(underp); if (underp) nodep->replaceWith(underp);
else nodep->unlinkFrBack(); else nodep->unlinkFrBack();
nodep->deleteTree(); nodep=NULL; nodep->deleteTree(); VL_DANGLING(nodep);
} }
} }
@@ -2265,8 +2272,12 @@ private:
virtual void visit(AstNode* nodep, AstNUser*) { virtual void visit(AstNode* nodep, AstNUser*) {
// Default: Just iterate // Default: Just iterate
if (m_required) { if (m_required) {
nodep->v3error("Expecting expression to be constant, but can't convert a " if (nodep->castNodeDType() || nodep->castRange()) {
<<nodep->prettyTypeName()<<" to constant."); // Ignore dtypes for parameter type pins
} else {
nodep->v3error("Expecting expression to be constant, but can't convert a "
<<nodep->prettyTypeName()<<" to constant.");
}
} else { } else {
// Calculate the width of this operation // Calculate the width of this operation
if (m_params && !nodep->width()) { if (m_params && !nodep->width()) {
@@ -2289,7 +2300,7 @@ public:
}; };
// CONSTUCTORS // CONSTUCTORS
ConstVisitor(ProcMode pmode) { explicit ConstVisitor(ProcMode pmode) {
m_params = false; m_params = false;
m_required = false; m_required = false;
m_doExpensive = false; m_doExpensive = false;
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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,7 +87,7 @@ private:
if (!nodep->isToggleCoverable()) if (!nodep->isToggleCoverable())
return "Not relevant signal type"; return "Not relevant signal type";
if (!v3Global.opt.coverageUnderscore()) { if (!v3Global.opt.coverageUnderscore()) {
if (prettyName.c_str()[0] == '_') if (prettyName[0] == '_')
return "Leading underscore"; return "Leading underscore";
if (prettyName.find("._") != string::npos) if (prettyName.find("._") != string::npos)
return "Inlined leading underscore"; return "Inlined leading underscore";
@@ -343,7 +343,7 @@ private:
// Skip all NEXT nodes under this block, and skip this if/case branch // Skip all NEXT nodes under this block, and skip this if/case branch
UINFO(4," OFF: "<<nodep<<endl); UINFO(4," OFF: "<<nodep<<endl);
m_checkBlock = false; m_checkBlock = false;
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} else { } else {
if (m_checkBlock) nodep->iterateChildren(*this); if (m_checkBlock) nodep->iterateChildren(*this);
} }
@@ -378,7 +378,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
CoverageVisitor(AstNetlist* rootp) { explicit CoverageVisitor(AstNetlist* rootp) {
// Operate on all modules // Operate on all modules
m_checkBlock = true; m_checkBlock = true;
m_beginHier = ""; m_beginHier = "";
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -93,7 +93,7 @@ private:
UINFO(8," new "<<removep->incp()->declp()<<endl); UINFO(8," new "<<removep->incp()->declp()<<endl);
// Mark the found node as a duplicate of the first node // Mark the found node as a duplicate of the first node
// (Not vice-versa as we have the iterator for the found node) // (Not vice-versa as we have the iterator for the found node)
removep->unlinkFrBack(); pushDeletep(removep); removep=NULL; removep->unlinkFrBack(); pushDeletep(removep); VL_DANGLING(removep);
// Remove node from comparison so don't hit it again // Remove node from comparison so don't hit it again
hashed.erase(dupit); hashed.erase(dupit);
++m_statToggleJoins; ++m_statToggleJoins;
@@ -121,7 +121,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
CoverageJoinVisitor(AstNetlist* nodep) { explicit CoverageJoinVisitor(AstNetlist* nodep) {
nodep->accept(*this); nodep->accept(*this);
} }
virtual ~CoverageJoinVisitor() { virtual ~CoverageJoinVisitor() {
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
+181 -36
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -25,7 +25,18 @@
// dependencies easier to resolve. // dependencies easier to resolve.
// NOTE: If redo this, consider using maybePointedTo()/broken() ish scheme // NOTE: If redo this, consider using maybePointedTo()/broken() ish scheme
// instead of needing as many visitors. // instead of needing as many visitors.
//************************************************************************* //
// The following nodes have package pointers and are cleaned up here:
// AstRefDType, AstEnumItemRef, AstNodeVarRef, AstNodeFTask
// These have packagep but will not exist at this stage
// AstPackageImport, AstDot, AstPackageRef
//
// Note on packagep: After the V3Scope/V3LinkDotScoped stage, package links
// are no longer used, but their presence prevents us from removing empty
// packages. As the links as no longer used after V3Scope, we remove them
// here after scoping to allow more dead node
// removal.
// *************************************************************************
#include "config_build.h" #include "config_build.h"
#include "verilatedos.h" #include "verilatedos.h"
@@ -49,7 +60,7 @@ private:
// VISITORS // VISITORS
virtual void visit(AstCell* nodep, AstNUser*) { virtual void visit(AstCell* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
nodep->modp()->user1(nodep->modp()->user1() - 1); nodep->modp()->user1Inc(-1);
} }
//----- //-----
virtual void visit(AstNodeMath* nodep, AstNUser*) {} // Accelerate virtual void visit(AstNodeMath* nodep, AstNUser*) {} // Accelerate
@@ -58,7 +69,7 @@ private:
} }
public: public:
// CONSTRUCTORS // CONSTRUCTORS
DeadModVisitor(AstNodeModule* nodep) { explicit DeadModVisitor(AstNodeModule* nodep) {
nodep->accept(*this); nodep->accept(*this);
} }
virtual ~DeadModVisitor() {} virtual ~DeadModVisitor() {}
@@ -71,10 +82,10 @@ class DeadVisitor : public AstNVisitor {
private: private:
// NODE STATE // NODE STATE
// Entire Netlist: // Entire Netlist:
// AstNodeModule::user1() -> int. Count of number of cells referencing this module. // AstNodeModule::user1() -> int. Count of number of cells referencing this module.
// AstVar::user1() -> int. Count of number of references // AstVar::user1() -> int. Count of number of references
// AstVarScope::user1() -> int. Count of number of references // AstVarScope::user1() -> int. Count of number of references
// AstNodeDType::user1() -> int. Count of number of references // AstNodeDType::user1() -> int. Count of number of references
AstUser1InUse m_inuser1; AstUser1InUse m_inuser1;
// TYPES // TYPES
@@ -82,11 +93,16 @@ private:
// STATE // STATE
AstNodeModule* m_modp; // Current module AstNodeModule* m_modp; // Current module
vector<AstNode*> m_varEtcsp; // List of all encountered to avoid another loop through tree vector<AstVar*> m_varsp; // List of all encountered to avoid another loop through tree
vector<AstNode*> m_dtypesp; // List of all encountered to avoid another loop through tree
vector<AstVarScope*> m_vscsp; // List of all encountered to avoid another loop through tree vector<AstVarScope*> m_vscsp; // List of all encountered to avoid another loop through tree
vector<AstScope*> m_scopesp; // List of all encountered to avoid another loop through tree
vector<AstCell*> m_cellsp; // List of all encountered to avoid another loop through tree
AssignMap m_assignMap; // List of all simple assignments for each variable AssignMap m_assignMap; // List of all simple assignments for each variable
bool m_elimUserVars; // Allow removal of user's vars bool m_elimUserVars; // Allow removal of user's vars
bool m_elimDTypes; // Allow removal of DTypes bool m_elimDTypes; // Allow removal of DTypes
bool m_elimScopes; // Allow removal of Scopes
bool m_elimCells; // Allow removal of Cells
bool m_sideEffect; // Side effects discovered in assign RHS bool m_sideEffect; // Side effects discovered in assign RHS
// METHODS // METHODS
@@ -97,19 +113,25 @@ private:
} }
void checkAll(AstNode* nodep) { void checkAll(AstNode* nodep) {
if (nodep != nodep->dtypep()) { // NodeDTypes reference themselves if (nodep != nodep->dtypep()) { // NodeDTypes reference themselves
if (AstNode* subnodep = nodep->dtypep()) subnodep->user1Inc(); if (AstNode* subnodep = nodep->dtypep()) {
subnodep->user1Inc();
}
}
if (AstNode* subnodep = nodep->getChildDTypep()) {
subnodep->user1Inc();
} }
if (AstNode* subnodep = nodep->getChildDTypep()) subnodep->user1Inc();
} }
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 && !nodep->castMemberDType() // Keep member names iff upper type exists
) { ) {
m_varEtcsp.push_back(nodep); m_dtypesp.push_back(nodep);
}
if (AstNode* subnodep = nodep->virtRefDTypep()) {
subnodep->user1Inc();
} }
if (AstNode* subnodep = nodep->virtRefDTypep()) subnodep->user1Inc();
} }
// VISITORS // VISITORS
@@ -119,11 +141,27 @@ private:
checkAll(nodep); checkAll(nodep);
m_modp = NULL; m_modp = NULL;
} }
virtual void visit(AstCFunc* nodep, AstNUser*) {
nodep->iterateChildren(*this);
checkAll(nodep);
if (nodep->scopep()) nodep->scopep()->user1Inc();
}
virtual void visit(AstScope* nodep, AstNUser*) {
nodep->iterateChildren(*this);
checkAll(nodep);
if (nodep->aboveScopep()) nodep->aboveScopep()->user1Inc();
if (!nodep->isTop() && !nodep->varsp() && !nodep->blocksp() && !nodep->finalClksp()) {
m_scopesp.push_back(nodep);
}
}
virtual void visit(AstCell* nodep, AstNUser*) { virtual void visit(AstCell* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
checkAll(nodep); checkAll(nodep);
m_cellsp.push_back(nodep);
nodep->modp()->user1Inc(); nodep->modp()->user1Inc();
} }
virtual void visit(AstNodeVarRef* nodep, AstNUser*) { virtual void visit(AstNodeVarRef* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
checkAll(nodep); checkAll(nodep);
@@ -135,14 +173,16 @@ private:
nodep->varp()->user1Inc(); nodep->varp()->user1Inc();
} }
if (nodep->packagep()) { if (nodep->packagep()) {
nodep->packagep()->user1Inc(); if (m_elimCells) nodep->packagep(NULL);
else nodep->packagep()->user1Inc();
} }
} }
virtual void visit(AstNodeFTaskRef* nodep, AstNUser*) { virtual void visit(AstNodeFTaskRef* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
checkAll(nodep); checkAll(nodep);
if (nodep->packagep()) { if (nodep->packagep()) {
nodep->packagep()->user1Inc(); if (m_elimCells) nodep->packagep(NULL);
else nodep->packagep()->user1Inc();
} }
} }
virtual void visit(AstRefDType* nodep, AstNUser*) { virtual void visit(AstRefDType* nodep, AstNUser*) {
@@ -150,7 +190,8 @@ private:
checkDType(nodep); checkDType(nodep);
checkAll(nodep); checkAll(nodep);
if (nodep->packagep()) { if (nodep->packagep()) {
nodep->packagep()->user1Inc(); if (m_elimCells) nodep->packagep(NULL);
else nodep->packagep()->user1Inc();
} }
} }
virtual void visit(AstNodeDType* nodep, AstNUser*) { virtual void visit(AstNodeDType* nodep, AstNUser*) {
@@ -162,11 +203,27 @@ private:
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
checkAll(nodep); checkAll(nodep);
if (nodep->packagep()) { if (nodep->packagep()) {
nodep->packagep()->user1Inc(); if (m_elimCells) nodep->packagep(NULL);
else nodep->packagep()->user1Inc();
} }
checkAll(nodep);
}
virtual void visit(AstModport* nodep, AstNUser*) {
nodep->iterateChildren(*this);
if (m_elimCells) {
if (!nodep->varsp()) {
pushDeletep(nodep->unlinkFrBack()); VL_DANGLING(nodep);
return;
}
}
checkAll(nodep);
} }
virtual void visit(AstTypedef* nodep, AstNUser*) { virtual void visit(AstTypedef* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
if (m_elimCells && !nodep->attrPublic()) {
pushDeletep(nodep->unlinkFrBack()); VL_DANGLING(nodep);
return;
}
checkAll(nodep); checkAll(nodep);
// Don't let packages with only public variables disappear // Don't let packages with only public variables disappear
// Normal modules may disappear, e.g. if they are parameterized then removed // Normal modules may disappear, e.g. if they are parameterized then removed
@@ -175,7 +232,8 @@ private:
virtual void visit(AstVarScope* nodep, AstNUser*) { virtual void visit(AstVarScope* nodep, AstNUser*) {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
checkAll(nodep); checkAll(nodep);
if (mightElim(nodep->varp())) { if (nodep->scopep()) nodep->scopep()->user1Inc();
if (mightElimVar(nodep->varp())) {
m_vscsp.push_back(nodep); m_vscsp.push_back(nodep);
} }
} }
@@ -183,11 +241,10 @@ private:
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
checkAll(nodep); checkAll(nodep);
if (nodep->isSigPublic() && m_modp && m_modp->castPackage()) m_modp->user1Inc(); if (nodep->isSigPublic() && m_modp && m_modp->castPackage()) m_modp->user1Inc();
if (mightElim(nodep)) { if (mightElimVar(nodep)) {
m_varEtcsp.push_back(nodep); m_varsp.push_back(nodep);
} }
} }
virtual void visit(AstNodeAssign* nodep, AstNUser*) { virtual void visit(AstNodeAssign* nodep, AstNUser*) {
// See if simple assignments to variables may be eliminated because that variable is never used. // See if simple assignments to variables may be eliminated because that variable is never used.
// Similar code in V3Life // Similar code in V3Life
@@ -199,7 +256,7 @@ private:
if (varrefp && !m_sideEffect if (varrefp && !m_sideEffect
&& varrefp->varScopep()) { // For simplicity, we only remove post-scoping && varrefp->varScopep()) { // For simplicity, we only remove post-scoping
m_assignMap.insert(make_pair(varrefp->varScopep(), nodep)); m_assignMap.insert(make_pair(varrefp->varScopep(), nodep));
checkAll(varrefp); // Must track reference to dtype() checkAll(varrefp); // Must track reference to dtype()
} else { // Track like any other statement } else { // Track like any other statement
nodep->lhsp()->iterateAndNext(*this); nodep->lhsp()->iterateAndNext(*this);
} }
@@ -229,19 +286,51 @@ private:
// And its children may now be killable too; correct counts // And its children may now be killable too; correct counts
// Recurse, as cells may not be directly under the module but in a generate // Recurse, as cells may not be directly under the module but in a generate
DeadModVisitor visitor(modp); DeadModVisitor visitor(modp);
modp->unlinkFrBack()->deleteTree(); modp=NULL; modp->unlinkFrBack()->deleteTree(); VL_DANGLING(modp);
retry = true; retry = true;
} }
} }
} }
} }
bool mightElim(AstVar* nodep) { bool mightElimVar(AstVar* nodep) {
return (!nodep->isSigPublic() // Can't elim publics! return (!nodep->isSigPublic() // Can't elim publics!
&& !nodep->isIO() && !nodep->isIO()
&& (nodep->isTemp() && (nodep->isTemp()
|| (nodep->isParam() && !nodep->isTrace()) || (nodep->isParam() && !nodep->isTrace())
|| m_elimUserVars)); // Post-Trace can kill most anything || m_elimUserVars)); // Post-Trace can kill most anything
} }
void deadCheckScope() {
for (bool retry=true; retry; ) {
retry = false;
for (vector<AstScope*>::iterator it = m_scopesp.begin(); it != m_scopesp.end();++it) {
AstScope* scp = *it;
if (!scp)
continue;
if (scp->user1() == 0) {
UINFO(4, " Dead AstScope " << scp << endl);
scp->aboveScopep()->user1Inc(-1);
if (scp->dtypep()) {
scp->dtypep()->user1Inc(-1);
}
scp->unlinkFrBack()->deleteTree(); VL_DANGLING(scp);
*it = NULL;
retry = true;
}
}
}
}
void deadCheckCells() {
for (vector<AstCell*>::iterator it = m_cellsp.begin(); it!=m_cellsp.end(); ++it) {
AstCell* cellp = *it;
if (cellp->user1() == 0 && !cellp->modp()->stmtsp()) {
cellp->modp()->user1Inc(-1);
cellp->unlinkFrBack()->deleteTree(); VL_DANGLING(cellp);
}
}
}
void deadCheckVar() { void deadCheckVar() {
// Delete any unused varscopes // Delete any unused varscopes
for (vector<AstVarScope*>::iterator it = m_vscsp.begin(); it!=m_vscsp.end(); ++it) { for (vector<AstVarScope*>::iterator it = m_vscsp.begin(); it!=m_vscsp.end(); ++it) {
@@ -251,34 +340,76 @@ private:
pair <AssignMap::iterator,AssignMap::iterator> eqrange = m_assignMap.equal_range(vscp); pair <AssignMap::iterator,AssignMap::iterator> eqrange = m_assignMap.equal_range(vscp);
for (AssignMap::iterator it = eqrange.first; it != eqrange.second; ++it) { for (AssignMap::iterator it = eqrange.first; it != eqrange.second; ++it) {
AstNodeAssign* assp = it->second; AstNodeAssign* assp = it->second;
UINFO(4," Dead assign "<<assp<<endl); UINFO(4," Dead assign "<<assp<<endl);
assp->unlinkFrBack()->deleteTree(); assp=NULL; assp->dtypep()->user1Inc(-1);
assp->unlinkFrBack()->deleteTree(); VL_DANGLING(assp);
} }
vscp->unlinkFrBack()->deleteTree(); vscp=NULL; if (vscp->scopep()) vscp->scopep()->user1Inc(-1);
vscp->dtypep()->user1Inc(-1);
vscp->unlinkFrBack()->deleteTree(); VL_DANGLING(vscp);
} }
} }
for (vector<AstNode*>::iterator it = m_varEtcsp.begin(); it!=m_varEtcsp.end(); ++it) { for (bool retry=true; retry; ) {
retry = false;
for (vector<AstVar *>::iterator it = m_varsp.begin(); it != m_varsp.end();++it) {
AstVar* varp = *it;
if (!varp)
continue;
if (varp->user1() == 0) {
UINFO(4, " Dead " << varp << endl);
if (varp->dtypep()) {
varp->dtypep()->user1Inc(-1);
}
varp->unlinkFrBack()->deleteTree(); VL_DANGLING(varp);
*it = NULL;
retry = true;
}
}
}
for (vector<AstNode*>::iterator it = m_dtypesp.begin(); it != m_dtypesp.end();++it) {
if ((*it)->user1() == 0) { if ((*it)->user1() == 0) {
UINFO(4," Dead "<<(*it)<<endl); AstNodeClassDType *classp;
(*it)->unlinkFrBack()->deleteTree(); (*it)=NULL; // It's possible that there if a reference to each individual member, but
// not to the dtype itself. Check and don't remove the parent dtype if
// members are still alive.
if ((classp = (*it)->castNodeClassDType())) {
bool cont = true;
for (AstMemberDType *memberp = classp->membersp(); memberp; memberp = memberp->nextp()->castMemberDType()) {
if (memberp->user1() != 0) {
cont = false;
break;
}
}
if (!cont)
continue;
}
(*it)->unlinkFrBack()->deleteTree(); VL_DANGLING(*it);
} }
} }
} }
public: public:
// CONSTRUCTORS // CONSTRUCTORS
DeadVisitor(AstNetlist* nodep, bool elimUserVars, bool elimDTypes) { DeadVisitor(AstNetlist* nodep, bool elimUserVars, bool elimDTypes, bool elimScopes, bool elimCells) {
m_modp = NULL; m_modp = NULL;
m_elimCells = elimCells;
m_elimUserVars = elimUserVars; m_elimUserVars = elimUserVars;
m_elimDTypes = elimDTypes; m_elimDTypes = elimDTypes;
m_elimScopes = elimScopes;
m_sideEffect = false; m_sideEffect = false;
// Prepare to remove some datatypes // Prepare to remove some datatypes
nodep->typeTablep()->clearCache(); nodep->typeTablep()->clearCache();
// Operate on whole netlist // Operate on whole netlist
nodep->accept(*this); nodep->accept(*this);
deadCheckVar(); deadCheckVar();
// We only elimate scopes when in a flattened structure
// Otherwise we have no easy way to know if a scope is used
if (elimScopes) deadCheckScope();
if (elimCells) deadCheckCells();
// Modules after vars, because might be vars we delete inside a mod we delete // Modules after vars, because might be vars we delete inside a mod we delete
deadCheckMod(); deadCheckMod();
// We may have removed some datatypes, cleanup // We may have removed some datatypes, cleanup
nodep->typeTablep()->repairCache(); nodep->typeTablep()->repairCache();
} }
@@ -290,16 +421,30 @@ public:
void V3Dead::deadifyModules(AstNetlist* nodep) { void V3Dead::deadifyModules(AstNetlist* nodep) {
UINFO(2,__FUNCTION__<<": "<<endl); UINFO(2,__FUNCTION__<<": "<<endl);
DeadVisitor visitor (nodep, false, false); DeadVisitor visitor (nodep, false, false, false, false);
V3Global::dumpCheckGlobalTree("deadModules.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6); V3Global::dumpCheckGlobalTree("deadModules.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
} }
void V3Dead::deadifyDTypes(AstNetlist* nodep) { void V3Dead::deadifyDTypes(AstNetlist* nodep) {
UINFO(2,__FUNCTION__<<": "<<endl); UINFO(2,__FUNCTION__<<": "<<endl);
DeadVisitor visitor (nodep, false, true); DeadVisitor visitor (nodep, false, true, false, false);
V3Global::dumpCheckGlobalTree("deadDType.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3); V3Global::dumpCheckGlobalTree("deadDtypes.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
} }
void V3Dead::deadifyDTypesScoped(AstNetlist* nodep) {
UINFO(2,__FUNCTION__<<": "<<endl);
DeadVisitor visitor (nodep, false, true, true, false);
V3Global::dumpCheckGlobalTree("deadDtypesScoped.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
}
void V3Dead::deadifyAll(AstNetlist* nodep) { void V3Dead::deadifyAll(AstNetlist* nodep) {
UINFO(2,__FUNCTION__<<": "<<endl); UINFO(2,__FUNCTION__<<": "<<endl);
DeadVisitor visitor (nodep, true, true); DeadVisitor visitor (nodep, true, true, false, true);
V3Global::dumpCheckGlobalTree("deadAll.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3); V3Global::dumpCheckGlobalTree("deadAll.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
} }
void V3Dead::deadifyAllScoped(AstNetlist* nodep) {
UINFO(2,__FUNCTION__<<": "<<endl);
DeadVisitor visitor (nodep, true, true, true, true);
V3Global::dumpCheckGlobalTree("deadAllScoped.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
}
+3 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -33,8 +33,10 @@ public:
static void deadifyModules(AstNetlist* nodep); static void deadifyModules(AstNetlist* nodep);
// Modules, Data types // Modules, Data types
static void deadifyDTypes(AstNetlist* nodep); static void deadifyDTypes(AstNetlist* nodep);
static void deadifyDTypesScoped(AstNetlist* nodep);
// Everything that's possible // Everything that's possible
static void deadifyAll(AstNetlist* nodep); static void deadifyAll(AstNetlist* nodep);
static void deadifyAllScoped(AstNetlist* nodep);
}; };
#endif // Guard #endif // Guard
+5 -5
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -374,9 +374,9 @@ private:
if (newlhsp) { if (newlhsp) {
nodep->lhsp(newlhsp); nodep->lhsp(newlhsp);
} else { } else {
nodep->unlinkFrBack()->deleteTree(); nodep=NULL; nodep->unlinkFrBack()->deleteTree(); VL_DANGLING(nodep);
} }
lhsp->deleteTree(); lhsp=NULL; lhsp->deleteTree(); VL_DANGLING(lhsp);
} }
else { else {
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
@@ -420,7 +420,7 @@ private:
} }
AstVarRef* newrefp = new AstVarRef(nodep->fileline(), dlyvscp, true); AstVarRef* newrefp = new AstVarRef(nodep->fileline(), dlyvscp, true);
newrefp->user2(true); // No reason to do it again newrefp->user2(true); // No reason to do it again
nodep->replaceWith(newrefp); nodep->deleteTree(); nodep=NULL; nodep->replaceWith(newrefp); nodep->deleteTree(); VL_DANGLING(nodep);
} }
else if (!m_inDly && nodep->lvalue()) { else if (!m_inDly && nodep->lvalue()) {
//UINFO(9,"NBA "<<nodep<<endl); //UINFO(9,"NBA "<<nodep<<endl);
@@ -450,7 +450,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
DelayedVisitor(AstNetlist* nodep) { explicit DelayedVisitor(AstNetlist* nodep) {
m_inDly = false; m_inDly = false;
m_activep=NULL; m_activep=NULL;
m_cfuncp=NULL; m_cfuncp=NULL;
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -157,7 +157,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
DepthVisitor(AstNetlist* nodep) { explicit DepthVisitor(AstNetlist* nodep) {
m_modp=NULL; m_modp=NULL;
m_funcp=NULL; m_funcp=NULL;
m_stmtp=NULL; m_stmtp=NULL;
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -125,7 +125,7 @@ private:
public: public:
// CONSTUCTORS // CONSTUCTORS
DepthBlockVisitor(AstNetlist* nodep) { explicit DepthBlockVisitor(AstNetlist* nodep) {
m_modp=NULL; m_modp=NULL;
m_depth=0; m_depth=0;
// //
+1 -1
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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
View File
@@ -6,7 +6,7 @@
// //
//************************************************************************* //*************************************************************************
// //
// Copyright 2003-2015 by Wilson Snyder. This program is free software; you can // Copyright 2003-2016 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.
@@ -247,7 +247,7 @@ private:
} }
public: public:
// CONSTRUCTORS // CONSTRUCTORS
DescopeVisitor(AstNetlist* nodep) { explicit DescopeVisitor(AstNetlist* nodep) {
m_modp = NULL; m_modp = NULL;
m_scopep = NULL; m_scopep = NULL;
m_needThis = false; m_needThis = false;

Some files were not shown because too many files have changed in this diff Show More