Language Support
- Disallow access to protected members from class scoped randomize constraint blocks -- the LRM is unclear about this but other tools seem to have decided this way made the most sense
- Added a check that net aliases aren't duplicated, and that nets don't alias to themselves, as mandated by the LRM (thanks to @likeamahoney)
- Implemented remaining rules for virtual interfaces:
- Virtual interfaces can't have hierarchical references to objects outside the interface
- Virtual interfaces can't have interface ports
- Instances assigned to a virtual interface can't have an instance configuration rule applied to them
Potentially Breaking Changes
- The minimum supported Xcode version is now 16 and the minimum supported Clang version is now 17 (to allow cleaning up workarounds for various bugs)
New Features
- Added -Wudp-coverage which warns about edge-sensitive user-defined primitives that don't specify an output state for all edges of all inputs (thanks to @likeamahoney)
- Added -Wpacked-array-conv which warns for conversions between different multidimensional packed array types even if their overall bit width is the same
- Added the -Wparentheses warning group for diagnosing common precedence-related syntactical errors, which includes the following new warnings: -Wbitwise-rel-precedence, -Warith-in-shift, -Wlogical-not-parentheses, -Wbitwise-op-parentheses, -Wlogical-op-parentheses, -Wconditional-precedence, -Wconsecutive-comparison
- Added -Wcase-type to warn about case statements with mismatching types in their item expressions
- Added -Wcase-default which warns about case statements that don't include a
defaultlabel - Added -Wcase-outside-range which warns for case items that can never be matched because they are outside the range of the case condition expression
- Added -Wcase-enum and -Wcase-enum-explicit which warns about enum values that are missing from a case statement (with and without the presence of a
defaultlabel, respectively) - Added -Wcase-dup which warns about duplicate item expressions in a case statement
- Added -Wcase-overlap which warns about overlapping case items (due to wildcard bits)
- Added -Wcase-not-wildcard and -Wcasez-with-x which warn about potentially misleading wildcard bits in non-wildcard case statements
- Added initial support for instance caching, which skips elaborating identical module instances to speed up elaboration. This is currently hidden behind the
--disable-instance-cachingcommand line flag because when turned on not all multi-driven errors are properly issued. Once all issues have been worked out the feature will be turned on by default. - Added the ability to output diagnostics to JSON instead of (or in addition to) plain text
- Added
--translate-off-formatwhich allows specifying comment directives that should act as skipped regions (for example,// pragma translate_offand// pragma translate_on) - slang warnings can now be turned on and off within source code using
// slang lint_offstyle comment directives - Added
--ast-json-detailed-typesto include detailed type information in AST JSON output - slang-tidy gained a
clkNameRegexStringoption to control how clocks are named (thanks to @spomatasmd)
Improvements
- Made -Wuseless-cast a bit less noisy -- it now does not warn about expressions involving genvars or cases where types are matching but one or the other has a different typedef alias name
- -Wsign-compare no longer warns about expressions involving genvars
- -Wvector-overflow no longer warns about signed literals with binary, octal, or hex bases that place a bit in the MSB
- Made some build tweaks to support hermetic builds (thanks to @cc10512)
- Added support for unions to slang-reflect (thanks to @Sustrak)
- Changed the error issued for sequences that can never be matched to be a warning instead (-Wseq-no-match) and added additional context to the diagnostic message
- Made minor tweaks to improve defparam and bind resolution performance
- -Wsign-conversion will no longer warn for certain system functions that have a return type of
intbut in practice only return a single bit result - Made some minor improvements to parser error recovery when struct definitions are missing a closing brace
- Inline genvars declared in generate loops are now included in the generate loop's members list when serializing the AST
- The pyslang packaging build is now done in this repo instead of a separate downstream repo (thanks to @parker-research)
- pyslang wheels now include support for arm64 (thanks to @gadfort)
- Documentation now includes the READMEs for the various ancillary slang tools
- Added stub generation to the Python distribution (thanks to @parker-research)
Fixes
- Fixed a bug with constant evaluation of left-hand side assignment patterns that require implicit conversions to be applied
- Fixed the locations returned by Trivia::getExplicitLocation for nested trivia involving directives (thanks to @povik)
- Fixed checking of illegal property negation operator when used within recursive property instantiations (thanks to @likeamahoney)
- Fixed a bug with serializing UninstantiatedDef AST nodes that use implicit named port connections
- Fixed a crash when checking duplicate drivers in assignments to invalid ranges of a vector
- Correctly allow unpacked unions to be used in equality and conditional expressions
- Fixed spurious warnings inside an unused generic class that instantiates the default specialization of itself
- Fixed Python bindings build to work with Python 3.13 (thanks to @vowstar)
- Fixed a spurious error when assigning the empty queue to an unresolved / unknown typed variable
- Correctly disallow override specifiers on class constructor declarations
- Correctly report an error for unbased unsized literals that use a
?instead of azcharacter for high impedance - Fixed handling of connections of interface arrays to ports with different declared dimensions
- Fixed a bug in constant evaluation of packed struct member access
- Correctly disallow select expressions of a parenthesized subexpression
- Fixed a bug where some type declarations in two modules with different parameter values could be erroneously considered equivalent to each other (thanks to @povik)
- Correctly disallow derived class virtual methods from declaring a different visibility level from their base class method
- Reworked how enum types are implemented to fix various issues related to enum values declared inside subexpressions from being visible to their surrounding scopes
- Fixed several issues related to enum value initializers that try to refer to themselves or other enum values
- Fixed a parser crash when an invalid class override specifier is at the very end of a file
- Fixed a potentially unbounded loop when resolving a specific case of invalid bind directives
- Fixed bad diagnostic output related to instantiating properties with missing formal argument names
- Fixed several minor issues with the Python bindings (thanks to @parker-research)
- Fixed bugs with pattern variables not being visible in certain scopes where they otherwise should have been
- Pattern variables are now properly usable from static variable initializer expressions
- $sformat in constant expressions now works properly with %p specifiers
- Fixed -Wwidth-expand to apply to conditional expressions
- Fixed [*] and ##[*] sequence repetitions to start from 0 instead of 1 (thanks to @georgerennie)
- Fixed a case where nested attributes were not properly diagnosed (thanks to @likeamahoney)
- Fixed type resolution for expressions involving static casts; previously the operand of the cast was considered self determined, but now the type of the cast is correctly propagated to the operand
- Fixed a bug in SyntaxNode::isEquivalentTo which would cause it to sometimes return the wrong result
- Fixed the direction of argument binding for n-output gate terminals