| A.1 |
"abs"(SIGNED) return SIGNED |
✗ |
| A.2 |
"-"(SIGNED) return SIGNED (unary) |
✗ |
| A.3 |
"+"(UNSIGNED, UNSIGNED) return UNSIGNED |
✓ |
| A.4 |
"+"(SIGNED, SIGNED) return SIGNED |
✓ |
| A.5 |
"+"(UNSIGNED, NATURAL) return UNSIGNED |
✓ |
| A.6 |
"+"(NATURAL, UNSIGNED) return UNSIGNED |
✓ |
| A.7 |
"+"(INTEGER, SIGNED) return SIGNED |
✗ |
| A.8 |
"+"(SIGNED, INTEGER) return SIGNED |
✗ |
| A.9 |
"-"(UNSIGNED, UNSIGNED) return UNSIGNED |
✓ |
| A.10 |
"-"(SIGNED, SIGNED) return SIGNED |
✓ |
| A.11 |
"-"(UNSIGNED, NATURAL) return UNSIGNED |
✗ |
| A.12 |
"-"(NATURAL, UNSIGNED) return UNSIGNED |
✗ |
| A.13 |
"-"(SIGNED, INTEGER) return SIGNED |
✗ |
| A.14 |
"-"(INTEGER, SIGNED) return SIGNED |
✗ |
| A.15 |
"*"(UNSIGNED, UNSIGNED) return UNSIGNED |
✓ |
| A.16 |
"*"(SIGNED, SIGNED) return SIGNED |
✓ |
| A.17 |
"*"(UNSIGNED, NATURAL) return UNSIGNED |
✗ |
| A.18 |
"*"(NATURAL, UNSIGNED) return UNSIGNED |
✗ |
| A.19 |
"*"(SIGNED, INTEGER) return SIGNED |
✗ |
| A.20 |
"*"(INTEGER, SIGNED) return SIGNED |
✗ |
| A.21 |
"/"(UNSIGNED, UNSIGNED) return UNSIGNED |
✗ |
| A.22 |
"/"(SIGNED, SIGNED) return SIGNED |
✗ |
| A.23 |
"/"(UNSIGNED, NATURAL) return UNSIGNED |
✗ |
| A.24 |
"/"(NATURAL, UNSIGNED) return UNSIGNED |
✗ |
| A.25 |
"/"(SIGNED, INTEGER) return SIGNED |
✗ |
| A.26 |
"/"(INTEGER, SIGNED) return SIGNED |
✗ |
| A.27 |
"rem"(UNSIGNED, UNSIGNED) return UNSIGNED |
✗ |
| A.28 |
"rem"(SIGNED, SIGNED) return SIGNED |
✗ |
| A.29 |
"rem"(UNSIGNED, NATURAL) return UNSIGNED |
✗ |
| A.30 |
"rem"(NATURAL, UNSIGNED) return UNSIGNED |
✗ |
| A.31 |
"rem"(SIGNED, INTEGER) return SIGNED |
✗ |
| A.32 |
"rem"(INTEGER, SIGNED) return SIGNED |
✗ |
| A.33 |
"mod"(UNSIGNED, UNSIGNED) return UNSIGNED |
✗ |
| A.34 |
"mod"(SIGNED, SIGNED) return SIGNED |
✗ |
| A.35 |
"mod"(UNSIGNED, NATURAL) return UNSIGNED |
✗ |
| A.36 |
"mod"(NATURAL, UNSIGNED) return UNSIGNED |
✗ |
| A.37 |
"mod"(SIGNED, INTEGER) return SIGNED |
✗ |
| A.38 |
"mod"(INTEGER, SIGNED) return SIGNED |
✗ |
| C.1 |
">"(UNSIGNED, UNSIGNED) return BOOLEAN |
✓ |
| C.2 |
">"(SIGNED, SIGNED) return BOOLEAN |
✗ |
| C.3 |
">"(NATURAL, UNSIGNED) return BOOLEAN |
✗ |
| C.4 |
">"(INTEGER, SIGNED) return BOOLEAN |
✗ |
| C.5 |
">"(UNSIGNED, NATURAL) return BOOLEAN |
✗ |
| C.6 |
">"(SIGNED, INTEGER) return BOOLEAN |
✗ |
| C.7 |
"<"(UNSIGNED, UNSIGNED) return BOOLEAN |
✓ |
| C.8 |
"<"(SIGNED, SIGNED) return BOOLEAN |
✗ |
| C.9 |
"<"(NATURAL, UNSIGNED) return BOOLEAN |
✗ |
| C.10 |
"<"(INTEGER, SIGNED) return BOOLEAN |
✗ |
| C.11 |
"<"(UNSIGNED, NATURAL) return BOOLEAN |
✗ |
| C.12 |
"<"(SIGNED, INTEGER) return BOOLEAN |
✗ |
| C.13 |
"<="(UNSIGNED, UNSIGNED) return BOOLEAN |
✓ |
| C.14 |
"<="(SIGNED, SIGNED) return BOOLEAN |
✗ |
| C.15 |
"<="(NATURAL, UNSIGNED) return BOOLEAN |
✗ |
| C.16 |
"<="(INTEGER, SIGNED) return BOOLEAN |
✗ |
| C.17 |
"<="(UNSIGNED, NATURAL) return BOOLEAN |
✗ |
| C.18 |
"<="(SIGNED, INTEGER) return BOOLEAN |
✗ |
| C.19 |
">="(UNSIGNED, UNSIGNED) return BOOLEAN |
✓ |
| C.20 |
">="(SIGNED, SIGNED) return BOOLEAN |
✗ |
| C.21 |
">="(NATURAL, UNSIGNED) return BOOLEAN |
✗ |
| C.22 |
">="(INTEGER, SIGNED) return BOOLEAN |
✗ |
| C.23 |
">="(UNSIGNED, NATURAL) return BOOLEAN |
✗ |
| C.24 |
">="(SIGNED, INTEGER) return BOOLEAN |
✗ |
| C.25 |
"="(UNSIGNED, UNSIGNED) return BOOLEAN |
✗ |
| C.26 |
"="(SIGNED, SIGNED) return BOOLEAN |
✗ |
| C.27 |
"="(NATURAL, UNSIGNED) return BOOLEAN |
✗ |
| C.28 |
"="(INTEGER, SIGNED) return BOOLEAN |
✗ |
| C.29 |
"="(UNSIGNED, NATURAL) return BOOLEAN |
✗ |
| C.30 |
"="(SIGNED, INTEGER) return BOOLEAN |
✗ |
| C.31 |
"/="(UNSIGNED, UNSIGNED) return BOOLEAN |
✗ |
| C.32 |
"/="(SIGNED, SIGNED) return BOOLEAN |
✗ |
| C.33 |
"/="(NATURAL, UNSIGNED) return BOOLEAN |
✗ |
| C.34 |
"/="(INTEGER, SIGNED) return BOOLEAN |
✗ |
| C.35 |
"/="(UNSIGNED, NATURAL) return BOOLEAN |
✗ |
| C.36 |
"/="(SIGNED, INTEGER) return BOOLEAN |
✗ |
| S.1 |
SHIFT_LEFT(UNSIGNED, NATURAL) |
✗ |
| S.2 |
SHIFT_RIGHT(UNSIGNED, NATURAL) |
✗ |
| S.3 |
SHIFT_LEFT(SIGNED, NATURAL) |
✗ |
| S.4 |
SHIFT_RIGHT(SIGNED, NATURAL) |
✗ |
| S.5 |
ROTATE_LEFT(UNSIGNED, NATURAL) |
✗ |
| S.6 |
ROTATE_RIGHT(UNSIGNED, NATURAL) |
✗ |
| S.7 |
ROTATE_LEFT(SIGNED, NATURAL) |
✗ |
| S.8 |
ROTATE_RIGHT(SIGNED, NATURAL) |
✗ |
| S.9 |
"sll"(UNSIGNED, INTEGER) |
✗ |
| S.10 |
"sll"(SIGNED, INTEGER) |
✗ |
| S.11 |
"srl"(UNSIGNED, INTEGER) |
✗ |
| S.12 |
"srl"(SIGNED, INTEGER) |
✗ |
| S.13 |
"rol"(UNSIGNED, INTEGER) |
✗ |
| S.14 |
"rol"(SIGNED, INTEGER) |
✗ |
| S.15 |
"ror"(UNSIGNED, INTEGER) |
✗ |
| S.16 |
"ror"(SIGNED, INTEGER) |
✗ |
| R.1 |
RESIZE(SIGNED, NATURAL) return SIGNED |
✓ |
| R.2 |
RESIZE(UNSIGNED, NATURAL) return UNSIGNED |
✓ |
| D.1 |
TO_INTEGER(UNSIGNED) return NATURAL |
✗ |
| D.2 |
TO_INTEGER(SIGNED) return INTEGER |
✗ |
| D.3 |
TO_UNSIGNED(NATURAL, NATURAL) return UNSIGNED |
✓ |
| D.4 |
TO_SIGNED(INTEGER, NATURAL) return SIGNED |
✓ |
| L.1 |
"not"(UNSIGNED) |
✗ |
| L.2 |
"and"(UNSIGNED, UNSIGNED) |
✗ |
| L.3 |
"or"(UNSIGNED, UNSIGNED) |
✗ |
| L.4 |
"nand"(UNSIGNED, UNSIGNED) |
✗ |
| L.5 |
"nor"(UNSIGNED, UNSIGNED) |
✗ |
| L.6 |
"xor"(UNSIGNED, UNSIGNED) |
✗ |
| L.7 |
"xnor"(UNSIGNED, UNSIGNED) |
✗ |
| L.8 |
"not"(SIGNED) |
✗ |
| L.9 |
"and"(SIGNED, SIGNED) |
✗ |
| L.10 |
"or"(SIGNED, SIGNED) |
✗ |
| L.11 |
"nand"(SIGNED, SIGNED) |
✗ |
| L.12 |
"nor"(SIGNED, SIGNED) |
✗ |
| L.13 |
"xor"(SIGNED, SIGNED) |
✗ |
| L.14 |
"xnor"(SIGNED, SIGNED) |
✗ |
| T.1 |
TO_01(UNSIGNED, STD_LOGIC) return UNSIGNED |
✓ |
| T.2 |
TO_01(SIGNED, STD_LOGIC) return SIGNED |
✓ |
There is quite some potential to notably speed up NVC for DSP-centric designs. Some of the numeric_std functions have JIT intrinsics (like unsigned comparisons) while many others have not (like signed comparisons). I wonder whether you are open to take pull requests implementing more of these functions as JIT intrinsics or whether there is something that would hold you back from accepting such pull requests? I'm aware that it would add quite a bit of code.
A first step could be to implement signed comparisons and the to_integer functions.
Here is the current status in NVC:
"abs"(SIGNED) return SIGNED"-"(SIGNED) return SIGNED(unary)"+"(UNSIGNED, UNSIGNED) return UNSIGNED"+"(SIGNED, SIGNED) return SIGNED"+"(UNSIGNED, NATURAL) return UNSIGNED"+"(NATURAL, UNSIGNED) return UNSIGNED"+"(INTEGER, SIGNED) return SIGNED"+"(SIGNED, INTEGER) return SIGNED"-"(UNSIGNED, UNSIGNED) return UNSIGNED"-"(SIGNED, SIGNED) return SIGNED"-"(UNSIGNED, NATURAL) return UNSIGNED"-"(NATURAL, UNSIGNED) return UNSIGNED"-"(SIGNED, INTEGER) return SIGNED"-"(INTEGER, SIGNED) return SIGNED"*"(UNSIGNED, UNSIGNED) return UNSIGNED"*"(SIGNED, SIGNED) return SIGNED"*"(UNSIGNED, NATURAL) return UNSIGNED"*"(NATURAL, UNSIGNED) return UNSIGNED"*"(SIGNED, INTEGER) return SIGNED"*"(INTEGER, SIGNED) return SIGNED"/"(UNSIGNED, UNSIGNED) return UNSIGNED"/"(SIGNED, SIGNED) return SIGNED"/"(UNSIGNED, NATURAL) return UNSIGNED"/"(NATURAL, UNSIGNED) return UNSIGNED"/"(SIGNED, INTEGER) return SIGNED"/"(INTEGER, SIGNED) return SIGNED"rem"(UNSIGNED, UNSIGNED) return UNSIGNED"rem"(SIGNED, SIGNED) return SIGNED"rem"(UNSIGNED, NATURAL) return UNSIGNED"rem"(NATURAL, UNSIGNED) return UNSIGNED"rem"(SIGNED, INTEGER) return SIGNED"rem"(INTEGER, SIGNED) return SIGNED"mod"(UNSIGNED, UNSIGNED) return UNSIGNED"mod"(SIGNED, SIGNED) return SIGNED"mod"(UNSIGNED, NATURAL) return UNSIGNED"mod"(NATURAL, UNSIGNED) return UNSIGNED"mod"(SIGNED, INTEGER) return SIGNED"mod"(INTEGER, SIGNED) return SIGNED">"(UNSIGNED, UNSIGNED) return BOOLEAN">"(SIGNED, SIGNED) return BOOLEAN">"(NATURAL, UNSIGNED) return BOOLEAN">"(INTEGER, SIGNED) return BOOLEAN">"(UNSIGNED, NATURAL) return BOOLEAN">"(SIGNED, INTEGER) return BOOLEAN"<"(UNSIGNED, UNSIGNED) return BOOLEAN"<"(SIGNED, SIGNED) return BOOLEAN"<"(NATURAL, UNSIGNED) return BOOLEAN"<"(INTEGER, SIGNED) return BOOLEAN"<"(UNSIGNED, NATURAL) return BOOLEAN"<"(SIGNED, INTEGER) return BOOLEAN"<="(UNSIGNED, UNSIGNED) return BOOLEAN"<="(SIGNED, SIGNED) return BOOLEAN"<="(NATURAL, UNSIGNED) return BOOLEAN"<="(INTEGER, SIGNED) return BOOLEAN"<="(UNSIGNED, NATURAL) return BOOLEAN"<="(SIGNED, INTEGER) return BOOLEAN">="(UNSIGNED, UNSIGNED) return BOOLEAN">="(SIGNED, SIGNED) return BOOLEAN">="(NATURAL, UNSIGNED) return BOOLEAN">="(INTEGER, SIGNED) return BOOLEAN">="(UNSIGNED, NATURAL) return BOOLEAN">="(SIGNED, INTEGER) return BOOLEAN"="(UNSIGNED, UNSIGNED) return BOOLEAN"="(SIGNED, SIGNED) return BOOLEAN"="(NATURAL, UNSIGNED) return BOOLEAN"="(INTEGER, SIGNED) return BOOLEAN"="(UNSIGNED, NATURAL) return BOOLEAN"="(SIGNED, INTEGER) return BOOLEAN"/="(UNSIGNED, UNSIGNED) return BOOLEAN"/="(SIGNED, SIGNED) return BOOLEAN"/="(NATURAL, UNSIGNED) return BOOLEAN"/="(INTEGER, SIGNED) return BOOLEAN"/="(UNSIGNED, NATURAL) return BOOLEAN"/="(SIGNED, INTEGER) return BOOLEANSHIFT_LEFT(UNSIGNED, NATURAL)SHIFT_RIGHT(UNSIGNED, NATURAL)SHIFT_LEFT(SIGNED, NATURAL)SHIFT_RIGHT(SIGNED, NATURAL)ROTATE_LEFT(UNSIGNED, NATURAL)ROTATE_RIGHT(UNSIGNED, NATURAL)ROTATE_LEFT(SIGNED, NATURAL)ROTATE_RIGHT(SIGNED, NATURAL)"sll"(UNSIGNED, INTEGER)"sll"(SIGNED, INTEGER)"srl"(UNSIGNED, INTEGER)"srl"(SIGNED, INTEGER)"rol"(UNSIGNED, INTEGER)"rol"(SIGNED, INTEGER)"ror"(UNSIGNED, INTEGER)"ror"(SIGNED, INTEGER)RESIZE(SIGNED, NATURAL) return SIGNEDRESIZE(UNSIGNED, NATURAL) return UNSIGNEDTO_INTEGER(UNSIGNED) return NATURALTO_INTEGER(SIGNED) return INTEGERTO_UNSIGNED(NATURAL, NATURAL) return UNSIGNEDTO_SIGNED(INTEGER, NATURAL) return SIGNED"not"(UNSIGNED)"and"(UNSIGNED, UNSIGNED)"or"(UNSIGNED, UNSIGNED)"nand"(UNSIGNED, UNSIGNED)"nor"(UNSIGNED, UNSIGNED)"xor"(UNSIGNED, UNSIGNED)"xnor"(UNSIGNED, UNSIGNED)"not"(SIGNED)"and"(SIGNED, SIGNED)"or"(SIGNED, SIGNED)"nand"(SIGNED, SIGNED)"nor"(SIGNED, SIGNED)"xor"(SIGNED, SIGNED)"xnor"(SIGNED, SIGNED)TO_01(UNSIGNED, STD_LOGIC) return UNSIGNEDTO_01(SIGNED, STD_LOGIC) return SIGNED