Releases: clash-lang/clash-compiler
v1.8.4
Changed:
Fixed:
collapseRHSNoopsnow runs after constant folding, making Clash able to constant fold more expressions than before. See #3036.- The
unzipfamily no longer retains a reference to the original input for every (unevaluated) part of the output tuple. Similarly,mapAccumLandmapAccumRare now also more eager to drop references. This can help to prevent space leaks. See #3038. - Individual items of
iterateIno longer retain a reference to the whole list, preventing space leaks. See #3042. - The compiler now tracks assignment types in more places, which can prevent "clash error call" errors in some specific cases. See #3045.
- Test bench primitives now assign the string they want to pass to Verilog's
$displayto a variable before printing. This works around a limitation in IVerilog. See #3046.
v1.8.3
Added:
Counterinstances forBool,Bit,Int,Int8,Int16,Int32,Int64,Word,Word8,Word16,Word32,Word64,IdentityandMaybe. #2692- The Vec type now has a COMPLETE pragma to avoid incomplete pattern matches when using the
(:>)pattern. #3020 - RamOp now has an AutoReg instance. #2792
- Added instance
NFDataX (SimOnly a)#2900 - Support for GHC 9.10 on Windows (macOS and Linux were already supported) #2945
- Added a
BitPackinstance forChar#2957 - Support for GHC 9.10.2 #3003
Changed:
- Functions defined on
Clash.Class.Counterare now public #2692
Fixed:
- Clash hanging when rendering
Index nliterals, for large values ofn#2813 - Render overflowed Index literals as don't-cares in HDL #2970
- Clash errors out when
Clash.Sized.Vector.splitAtis compile-time evaluated in an illegal context [#2831]#2831 Clash.Explicit.DDR: #2911ddrIn: VHDL: Remove data input from sensitivity list ofddrIn_neg_latchregister as it is superfluous. This should not affect functionality.ddrOut: VHDL: Fix incorrect usage ofEnableinput when the domain is set to asynchronous resets. Deasserting theEnableexhibited wrong behavior before this fix.
Clash.Xilinx.DDR: #2911- These primitives only support clocks where the rising edge is the active edge. Using them in a domain with falling active edges now causes an error.
oddr: Fix VHDL and SystemVerilog erroring out during HDL generation- Symbols in HDL for both
iddrandoddrwere renamed to match their function.
Clash.Intel.DDR: #2911- These primitives only support clocks where the rising edge is the active edge. Using them in a domain with falling active edges now causes an error.
- Fix rendering HDL. It variously errored out or generated non-working HDL.
- Rendering HDL no longer causes Clash to issue a warning about an argument unused in Haskell but used in the primitive black box.
makeTopEntitynow accounts forSimOnlyconstructs. This can prevent warnings in situtations where theSimOnlytype would contain typesmakeTopEntitycannot handle. #2897- Clash did not build on GHC 9.6.7 (but did on 9.6.6) #2916
- Ignore
Ticks inTermLiteral Integer,TermLiteral Char,TermLiteral Natural, andTermLiteral (SNat n)#2925 - Fixed laziness issue in internal black box
imap_go#2542 - Clash's evaluator now uses
TemplateHaskellnames to detect renamed symbols inGHC.*andClash.*. Fixes errors similar toNo blackbox found for: GHC.Internal.Base.eqString#2972 - No blackbox found for:
GHC.Internal.Control.Exception.Base.recSelErroron GHC 9.10 #2966 - Verilog and System Verilog code gen bug for
map head#2809 - Error parsing blackbox:
Clash.Sized.Vector.head#2988 - Clash no longer duplicates included datafiles when component is instantiated multiple times #3008
- Clash will no longer emit "no blackbox found for"
GHC.Real's exponentiation function if it is applied to constants #3010 - Clash will no longer error out when converting
ensureSpineon Clash number types to HDL #3021 - Clash will no longer ignore Synthesize annotations when the function is used in an argument position #3024
v1.8.2
Added:
- Support for GHC 9.10 #2758
- Support for GHC 9.8.4 #2852
- Add
ShowX,NFDataXinstances forProxy#2637 - Added
Clash.Sized.Vector.ToTuple.vecToTuple: a way to safely work around incomplete patterns warnings on patterns involvingVectors. #2862 - Added operator precedences for infix usage of functions exported from
Clash.Class.Num:mul,add,sub,satMul,satAdd,satSub,boundedMul,boundedAdd, andboundedSub. This means that expressions such asa `add` b `mul` cnow get parsed asa `add` (b `mul` c)instead of(a `add` b) `mul` c. #2719
Changed:
BitVector nnow has an implementation forensureSpinewhich ensures the constructor is present. #2702xToBVis now located inClash.Sized.Internal.BitVectorto avoid circular dependencies. #2702- The error messages that mention the valid ranges for out-of-range inputs have been improved to be more intuitive: one of
<empty range>,[n]or[n..m]. All n..m ranges are now ordered with the lower bound on the left. #2733
Fixed:
- cabal: Make
workaround-ghc-mmap-crasha noop on non-x86_64. Fixes #2656 - Clash no longer hides error messages if it fails to load external (precompiled) modules. Note: this fix only works from GHC 9.0 on. See #2365
- HDL generation fails when using multiple-hidden feature in combination with synthesis attributes #2593
- Clash no longer errors out in the netlist generation stage when a polymorphic function is applied to type X in one alternative of a case-statement and applied to a newtype wrapper of type X in a different alternative. See #2828
- various issues with black boxes and evaluator rules for number-related primitives #2689
genBitVectorno longer contains off-by-one error on for generated Naturals #2704- (+>>.) and (.<<+) such that they are compliant with (+>>) and (<<+) for vectors of zero length in the sense that the input vector is kept unchanged. #2730
- Removed
stringsearchdependency fromv16-upgrade-primitives. See #2726 - Bug in the compile-time evaluator #2781
- Exponentiation (
Clash.Class.Exp) is now right-associative with a precedence level of 8 (infixr 8). By accident, it used to lack a fixity declaration, meaning it was implicitly left-associative at level 9. #2818 - Unused argument warnings on writeToBiSignal# #2822
- Clash errored saying it cannot translate a globally recursive function in code that originally only contains let-bound (local) recursion #2839
- Clash generates illegal Verilog names #2845
v1.8.1
- Bump package dependencies to allow inclusion in stackage-nightly
- Bump package dependencies to allow building on GHC 9.8.1
v1.8.0
Release highlights:
- Support for GHC 9.2, 9.4, 9.6 and 9.8. While GHC 9.2 is supported, we recommend users to skip this version as there is a severe degradation of error message quality. With this change, Clash now supports GHC versions 8.6 through 9.8.
- Major overhaul of the clocking functionality in
Clash.Xilinx.ClockGenandClash.Intel.ClockGen, see their respective entries below mealySfunction (and several variations) to make writing state machines using the strictStatemonad easier- Overhaul of
resetGlitchFilter, see its respective entries below.
Added:
altpllSyncandalteraPllSyncinClash.Intel.ClockGen. These replace the deprecated functions without theSyncsuffix. Unlike the old functions, these functions are safe to use and have a reset signal for each output domain that can be used to keep the domain in reset while the clock output stabilizes. All PLL functions now also support multiple clock outputs like the oldalteraPlldid. #2592- A new clock type
DiffClockis introduced to signify a differential clock signal that is passed to the design on two ports in antiphase. This is used by the differential Xilinx clock wizards inClash.Xilinx.ClockGen. #2592 Clash.Explicit.Testbench.clockToDiffClock, to create a differential clock signal in a test bench. It is not suitable for synthesizing a differential output in hardware. #2592resetGlitchFilterWithReset, which accomplishes the same task asresetGlitchFilterin domains with unknown initial values by adding a power-on reset input to reset the glitch filter itself. #2544- Convenience functions:
noReset,andReset,orResetplus their unsafe counterparts #2539 - Convenience constraint aliases:
HasSynchronousReset,HasAsynchronousReset, andHasDefinedInitialValues#2539 Clash.Prelude.Mealy.mealySandClash.Explicit.Mealy.mealySand their bundled equivalentsmealySBwhich make writing state machines using the strictStatemonad easier. The tutorial has also been simplified by using this change. #2484- An experimental feature allowing clocks to vary their periods over time, called "dynamic clocks". Given that this is an experimental feature, it is not part of the public API. #2295
- The prelude now exports
+>>.and.<<+, which can be used to shift in a bit into aBitVectorfrom the left or right respectively - similar to+>>and<<+forVecs. #2307 Clash.DataFiles.tclConnectorand the executablestatic-filesinclash-lib. They provide the Tcl Connector, a Tcl script that allows Vivado to interact with the metadata generated by Clash (Quartus support will be added later). SeeClash.DataFiles.tclConnectorfor further information. More documentation about the Tcl Connector and the Clash<->Tcl API will be made available later. #2335- Add
BitPack,NFDataXandShowXinstances forOrdering#2366 - Verilog users can now influence the "precision" part of the generated
timescalepragma using-fclash-timescale-precision. #2353 - Clash now includes blackboxes for
integerToFloat#,integerToDouble##2342 - Instances
Arbitrary (Erroring a),Arbitrary (Saturating a),Arbitrary (Saturating a), andArbitrary (Zeroing a)#2356 Clash.Magic.clashSimulation, a way to differentiate between Clash simulation and generating HDL. #2473Clash.Magic.clashCompileError: make HDL generation error out with a custom error message. Simulation in Clash will also error when the function is evaluated, including a call stack. HDL generation unfortunately does not include a call stack. #2399- Added
Clash.XException.MaybeX, a data structure with smart constructors that can help programmers deal withXExceptionvalues in their blackbox model implementations #2442 Clash.Magic.SimOnly, A container for data you only want to have around during simulation and is ignored during synthesis. Useful for carrying around things such as: a map of simulation/vcd traces, co-simulation state or meta-data, etc. #2464KnownNat (DomainPeriod dom)as an implied constraint toKnownDomain dom. This reduces the amount of code needed to write - for example - clock speed dependent code. #2541Clash.Annotations.SynthesisAttributes.annotate: a term level way of annotating signals with synthesis attributes #2547Clash.Annotations.SynthesisAttributes.markDebug: a way of marking a signals "debug", instructing synthesizers to leave the signal alone and offer debug features #2547- Add hex and octal BitVector parsing. #1772
1 <= n => Foldable1 (Vec n)instance (base-4.18+only) #2563- You can now use
~PERIOD,~ISSYNC,~ISINITDEFINEDand~ACTIVEEDGEon arguments of typeClock,Reset,Enable,ClockNandDiffClock. #2590
Removed:
- Deprecated module
Clash.Prelude.BitIndex: functions have been moved toClash.Class.BitPack#2555 - Deprecated module
Clash.Prelude.BitReduction: functions have been moved toClash.Class.BitPack#2555 - Deprecated function
Clash.Explicit.Signal.enable: function has been renamed toandEnable#2555 - The module
Clash.Clocks.Derivinghas been removed. #2592
Deprecated:
unsafeFromLowPolarity,unsafeFromHighPolarity,unsafeToLowPolarity,unsafeToHighPolarityhave been replaced byunsafeFromActiveLow,unsafeFromActiveHigh,unsafeToActiveLow,unsafeToActiveHigh. While former ones will continue to exist, a deprecation warning has been added pointing to the latter ones. #2540- The functions
altpllandalteraPllinClash.Intel.ClockGenhave been deprecated because they are unsafe to use while this is not apparent from the name. Thelockedoutput signal of these functions is an asynchronous signal which needs to be synchronized before it can be used (something the examples did in fact demonstrate). For the common use case, new functions are available, namedaltpllSyncandalteraPllSync. These functions are safe. For advanced use cases, the old functionality can be obtained throughunsafeAltpllandunsafeAlteraPll. #2592
Changed:
- The wizards in
Clash.Xilinx.ClockGenhave been completely overhauled. The original functions were unsafe and broken in several ways. See the documentation inClash.Xilinx.ClockGenfor how to use the new functions. Significant changes are:clockWizardandclockWizardDifferentialnow output aClockand aResetwhich can be directly used by logic. Previously, it outputted a clock and an asynchronouslockedsignal which first needed to be synchronized before it could be used (hence the old function being unsafe). Additionally, the originallockedsignal was strange: it mistakenly was anEnableinstead of aSignal dom Booland there was a polarity mismatch between Clash simulation and HDL. Thelockedsignal was also not resampled to the output domain in Clash simulation.- There are new functions
unsafeClockWizardandunsafeClockWizardDifferentialfor advanced use cases which directly expose thelockedoutput of the wizard. - All clock generators now have the option to output multiple clocks from a single instance.
clockWizardDifferentialnow gets its input clock as aDiffClocktype; useclockToDiffClockto generate this in your test bench if needed. Previously, the function received two clock inputs, but this generatedcreate_clockstatements in the top-level SDC file for both phases which is incorrect.- A constraint was removed: The output clock domain no longer requires asynchronous resets. This was originally intended to signal that the outgoing lock signal is an asynchronous signal. The constraint does not convey this information at all and is wrong; it also prevents using synchronous resets in the circuit as recommended by Xilinx. Note that if you use the
unsafefunctions, it is still necessary to synchronize thelockedoutput in your design. - The port names of the primitives in HDL are now correctly lower case.
- Add Tcl generation. This moves the responsibility of MMCM component generation from the user to
clashConnector.tcl, which can be found in [clash-lib:Clash.DataFiles](https://hackage.haskell.org/package/clash-lib-1.8.0/docs/Cl...
v1.6.6
-
Support Aeson 2.2 #2578
-
Drop the snap package #2439
The Clash snap package has not been a recommended way to use Clash for quite some time, and it is a hassle to support.
In order to build a snap package, we build .deb packages for Clash with Ubuntu 20.04 LTS. But the interaction between the Debian build system and GHC is problematic, requiring significant effort to support and to upgrade to a more recent Ubuntu release.
Additionally, snap packages have their own issues on distributions other than Ubuntu. Given that we no longer recommend people use our snap package and given the effort required to keep supporting them, we have decided to drop the snap package.
v1.6.5
Fixed:
- Support building with all combinations of specific versions of our dependencies
hashableandprimitive. #2485 - The Haskell simulation of the PLL lock signal in
Clash.Clocks(used byClash.Intel.ClockGen) is fixed: the signal is now unasserted for the time the reset input is asserted and vice versa, and no longer crashes the simulation. HDL generation is unchanged. The PLL functions now have an additional constraint:KnownDomain pllLock. #2420
Changed:
- Export the constructor for the
Wrappingtype in theClash.Num.Wrappingmodule. See #2292
v1.6.4
Fixed:
- Input validation of the used arguments in blackboxes is now complete. #2184
Clash.Annotations.BitRepresentation.Deriving.deriveAnnotationno longer has quadratic complexity in the size of the constructors and fields. #2209- Fully resolve type synonyms when deriving bit representations. #2209
- Disregard ticks when determining whether terms are shared. Fixes #2233.
- The blackbox parser will make sure it fully parses its input, and report an error when it can't. #2237
- Wrap ~ARG[n] in parentheses. Fixes #2213
- The VHDL shift primitives no longer generate bound check failures. Fixes #2215
- Evaluator fails impredicative type instantiation of error values #2272
- Fix out of bound errors in toEnum/fromSLV for sum types #2220
- Netlist generation fails for certain uses of GADTs #2289
- The documentation for
ANN TestBenchhad it backwards; it now correctly indicates the annotation is on the test bench, not the device under test. #1750
Fixes with minor changes:
reduceXornow produces a result if the argument has undefined bits instead of throwing anXException(the result is an undefined bit).reduceAndandreduceOralready always produced a result. #2244
Added:
- Support for symbols in types while deriving bit representations. #2209
- Support for promoted data types while deriving bit representations. #2209
scanlParandscanrParin Clash's Prelude, as well as theRTreeversionstscanlandtscanr. These variants ofscanl1andscanr1compile to a binary tree of operations, with a depth ofO(log(n))(nbeing the length of the vector) rather than a depth ofnforscanl1andscanr1. #2177- The GADT constructors for
RTree(RLeafandRBranch) are now exported directly in addition to the patternsLRandBR. #2177 - Added the
~ISSCALARtemplate which can be used to check if an argument is rendered to a scalar in HDL. #2184 - Added support for records and infix constructors when using
Clash.Annotations.BitRepresentation.Deriving.deriveAnnotation. #2191 - Clash now contains instances for
ShowX,NFDataXandBitPackon the newtypes from the Data.Functor modules (Identity,Const,Compose,ProductandSum). #2218
v1.6.3
Fixed:
- Handle
~ISUNDEFINEDhole in black boxes forBitVectorand for product types. This means that with-fclash-aggressive-x-optimization-blackboxes, resets are now omitted for undefined reset values of such types as well. #2117 - The
alteraPllprimitive was unusable since commitd325557750(release v1.4.0), it now works again. #2136 - Simulation/Synthesis mismatch for X-exception to undefined bitvector conversion #2154
- The VHDL blackbox for
Signed.fromIntegercan now handle anyNetlist Expras input #2149 - Clash no longer escapes extended identifiers when rendering SDC files. #2142
- The types defined in
clash-prelude-hedgehognow come withShowinstances #2133 - Extreme values are now generated from the input range instead of the type's bounds #2138
Internal change:
v1.6.2
Fixed:
- Clash now compiles for users of Clang - i.e., all macOS users.
- The
trueDualPortBlockRammodel did not accurately simulate concurrent active ports, thus causing a Haskell/HDL simulation mismatch forasyncFIFOSynchronizer. trueDualPortBlockRamHaskell/HDL simulation mismatch for port enable.- Sometimes
trueDualPortBlockRamswapped the names of the ports in exception messages. #2102 - The evaluator rule for unpack{Float,Double}# are now corrected to return boxed float and double instead of unboxed literals. #2097
Changed:
- The
trueDualPortBlockRammodel now only models read/write conflicts for concurrent active ports - The
trueDualPortBlockRammodel now models write/write conflicts for concurrent active ports