This patch does a better job of recovering from an error in a task or function definition. This prevents the compiler from printing many irrelevant error messages.
This patch adds the functionality to tasks/functions to handle the declaration of multiple ports using a single ANSI declaration. It also deletes the old range vector before it adds the new one. The tasks and functions are different than modules so we need to copy the range for them.
Several places in Icarus Verilog try to get the bits of the integer part of a double by casting to unsigned or unsigned long. But that causes some compilers to generate smart code that converts all values less then 0 to 0, even though we are after the bits, not the math value. So be careful to do this cast only to non-negative values and uminus the bits if necessary to get exactly what we want. Signed-off-by: Stephen Williams <email@example.com>
Update the magnitide compare and bitwise not operators to use optimized methods where possible.
The vvp_vector4_t often receives the results of vector arithmetic. Add an optimized method for setting that data into the vector. Take into account that arithmetic results have no X/Z bits, etc.
Logical and/or take as inputs condition expressions, which are scalar expressions. Be sure to reduce vectors using proper logic to get the right condition value.
This patch adds check to determine if an always block has delay in it or not. If there is no delay a runtime infinite loop will occur. For the indeterminate case it will print a warning message if the new -Winfloop flag is given. This flag is not part of the -Wall check!
When generating a real expression you can have bits of the expression that use vector only operands. When this happens evaluate that part of the expression as a vector and then convert it to a real value.
When left-shifting unsized constants in self-determined contexts, the constant value is normally pared down to its minimum required width. But this practically guarantees loss of bits. Instead, detect this special case and give the unsized constant a width of an integer. Still allow for the super-special case that the shifted value and the shift amount are constants. In that case, the result width (and value) can be calculated precisely and there is no need to resort to default widths.
This patch uses the true delay expression count not the truncated one to check that the number of delay expressions is correct. It also prints the actual number of expressions it found when printing the error message.
By slightly altering the vvp_bit4_t encoding, a few simple optimizations become possible. By making Z==2 and X==3, the conversion from X/Z to X is a simple shift-or, and this can be used to reduce the size of some of the bit4 operators.
Remove dependencies on vvp_bit4_encoding outside of the vvp_net core types. The table_functor_s class was the worst offfender and was barely used, so it is now removed completely. There are a few opcodes in vhtread.cc that also make vvvp_bit4_t encoding assumptions (and used casts) and those have been fixed. There were also various VPI interface functions that are fixed.
The vvp_vector4_t holds 4-value logic. This patch changes the encoding of 4-value bits in the vector to use separate A- and B bit vectors, with the B- vector signaling the A- bits that are not 0/1. This allows rapid conversion to 2-value logic, and rapid tests for X and Z values.
Update the rules for parsing user function definitions to allow Verilog-2001 ANSI style port declarations. In the process, also unify with the user task port declaration so that the types don't diverge. The rules are the same for both, with the extra constraint that function ports must all be input. This latter rule is checked later, during elaboration, so that the task/function pform code can be shared, and better error messages can be generated.
This patch fixes deassign to allow it to unlink from a driver. It also zeros the cassign_link and force_link pointers after they have been unlinked. Not doing this will cause an assert if deassign/release are called multiple times (variable only).
commonly, the make install is run in a compiled directory by a different user (i.e. an administrator) that doesn't necessarily have write access to the build directory. This patch fixes it so that the test that the version.h is up to date doesn't need to write a temporary file in the build directory. It also makes sure that if there is a real need to update the verion.h, and it is not writable, then properly fail the build.
This patch adds assign/deassign for real variables and force/release for real variables and nets.
When constant values are added to get another constant value, and the expression is not otherwise a fixed size, then trim the result to prevent unbounded expansion of unsized expression with. In the process, find and fix a bug in the vtrim function that caused an assert if trimming were not possible for an unsigned value.
This patch fixes the elaboration of parameters in a continuous assignment to only pad the constants to their defined width. Previously they were padded to the l-value width which resulted in a vvp runtime error. This appears to be because the width for padding is the defined width, but the constant is printed using its internal width which previously could be larger than its defined width. These constants are local nets so I added that flag as well.