packages feed

clash-lib 1.8.2 → 1.8.3

raw patch · 34 files changed

+531/−290 lines, 34 filesdep ~clash-preludedep ~textPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: clash-prelude, text

API changes (from Hackage documentation)

- Clash.Core.Pretty: instance Clash.Core.Pretty.PrettyPrec SrcLoc.SrcSpan
- Clash.Core.Pretty: instance Data.Default.Class.Default Clash.Core.Pretty.PrettyOptions
- Clash.Core.TermLiteral: instance Clash.Core.TermLiteral.TermLiteral GHC.Integer.Type.Integer
- Clash.Core.TermLiteral: instance Clash.Core.TermLiteral.TermLiteral GHC.Natural.Natural
- Clash.Core.TysPrim: voidPrimTy :: Type
- Clash.Edalize.Edam: instance Data.Default.Class.Default Clash.Edalize.Edam.EdamTools
- Clash.Edalize.Edam: instance Data.Default.Class.Default Clash.Edalize.Edam.GhdlOptions
- Clash.Edalize.Edam: instance Data.Default.Class.Default Clash.Edalize.Edam.IcarusOptions
- Clash.Edalize.Edam: instance Data.Default.Class.Default Clash.Edalize.Edam.ModelsimOptions
- Clash.Edalize.Edam: instance Data.Default.Class.Default Clash.Edalize.Edam.QuartusOptions
- Clash.Edalize.Edam: instance Data.Default.Class.Default Clash.Edalize.Edam.VivadoOptions
- Clash.Netlist.BlackBox: collectAppIO :: NetlistId -> [Term] -> [Term] -> NetlistMonad (Expr, [Declaration])
- Clash.Netlist.BlackBox: collectBindIO :: NetlistId -> [Term] -> NetlistMonad (Expr, [Declaration])
- Clash.Netlist.BlackBox: collectMealy :: HasCallStack => Identifier -> NetlistId -> TyConMap -> [Term] -> NetlistMonad [Declaration]
- Clash.Netlist.BlackBox: mkArgument :: Text -> Identifier -> Int -> Term -> NetlistMonad ((Expr, HWType, Bool), [Declaration])
- Clash.Netlist.BlackBox: mkFunInput :: HasCallStack => Text -> Id -> Term -> NetlistMonad ((Either BlackBox (Identifier, [Declaration]), Usage, [BlackBoxTemplate], [BlackBoxTemplate], [((Text, Text), BlackBox)], BlackBoxContext), [Declaration])
- Clash.Netlist.BlackBox: unSimIO :: TyConMap -> Term -> Term
- Clash.Netlist.BlackBox: warn :: ClashOpts -> String -> IO ()
- Clash.Netlist.BlackBox.Util: bbResult :: HasCallStack => String -> BlackBoxContext -> (Expr, HWType)
- Clash.Netlist.BlackBox.Util: checkUndefined :: Expr -> Bool
- Clash.Netlist.BlackBox.Util: elementToText :: BlackBoxContext -> Element -> Either String Text
- Clash.Netlist.BlackBox.Util: elementsToText :: BlackBoxContext -> [Element] -> Either String Text
- Clash.Netlist.BlackBox.Util: generalGetDomainConf :: forall m. (Monad m, HasCallStack) => m DomainMap -> HWType -> m VDomainConfiguration
- Clash.Netlist.BlackBox.Util: idToExpr :: (Text, HWType) -> (Expr, HWType, Bool)
- Clash.Netlist.BlackBox.Util: inputHole :: Element -> Maybe Int
- Clash.Netlist.BlackBox.Util: lineToIdentifier :: Backend backend => BlackBoxContext -> BlackBoxTemplate -> State backend Text
- Clash.Netlist.BlackBox.Util: lineToType :: BlackBoxContext -> BlackBoxTemplate -> HWType
- Clash.Netlist.BlackBox.Util: parseFail :: Text -> BlackBoxTemplate
- Clash.Netlist.BlackBox.Util: prettyElem :: (HasCallStack, Monad m) => Element -> Ap m Text
- Clash.Netlist.BlackBox.Util: renderFilePath :: [(String, FilePath)] -> String -> ([(String, FilePath)], String)
- Clash.Netlist.BlackBox.Util: renderTag :: Backend backend => BlackBoxContext -> Element -> State backend Text
- Clash.Netlist.BlackBox.Util: selectNewName :: Foldable t => t String -> FilePath -> String
- Clash.Netlist.BlackBox.Util: usedVariables :: Expr -> [IdentifierText]
- Clash.Primitives.DSL: instance Data.Default.Class.Default Clash.Primitives.DSL.BlackBoxHaskellOpts
- Clash.Unique: instance Clash.Unique.Uniquable GHC.Word.Word64
- GHC.BasicTypes.Extra: instance Control.DeepSeq.NFData BasicTypes.InlineSpec
- GHC.BasicTypes.Extra: instance Data.Binary.Class.Binary BasicTypes.InlineSpec
- GHC.BasicTypes.Extra: instance GHC.Generics.Generic BasicTypes.InlineSpec
+ Clash.Core.Pretty: instance Clash.Core.Pretty.PrettyPrec GHC.Types.SrcLoc.SrcSpan
+ Clash.Core.Pretty: instance Data.Default.Internal.Default Clash.Core.Pretty.PrettyOptions
+ Clash.Core.TermLiteral: instance Clash.Core.TermLiteral.TermLiteral GHC.Num.Integer.Integer
+ Clash.Core.TermLiteral: instance Clash.Core.TermLiteral.TermLiteral GHC.Num.Natural.Natural
+ Clash.Edalize.Edam: instance Data.Default.Internal.Default Clash.Edalize.Edam.EdamTools
+ Clash.Edalize.Edam: instance Data.Default.Internal.Default Clash.Edalize.Edam.GhdlOptions
+ Clash.Edalize.Edam: instance Data.Default.Internal.Default Clash.Edalize.Edam.IcarusOptions
+ Clash.Edalize.Edam: instance Data.Default.Internal.Default Clash.Edalize.Edam.ModelsimOptions
+ Clash.Edalize.Edam: instance Data.Default.Internal.Default Clash.Edalize.Edam.QuartusOptions
+ Clash.Edalize.Edam: instance Data.Default.Internal.Default Clash.Edalize.Edam.VivadoOptions
+ Clash.Netlist.BlackBox.Types: EscapedSymbol :: EscapedSymbol -> Element
+ Clash.Netlist.BlackBox.Types: SquareBracketClose :: EscapedSymbol
+ Clash.Netlist.BlackBox.Types: SquareBracketOpen :: EscapedSymbol
+ Clash.Netlist.BlackBox.Types: data EscapedSymbol
+ Clash.Netlist.BlackBox.Types: instance Control.DeepSeq.NFData Clash.Netlist.BlackBox.Types.EscapedSymbol
+ Clash.Netlist.BlackBox.Types: instance Data.Binary.Class.Binary Clash.Netlist.BlackBox.Types.EscapedSymbol
+ Clash.Netlist.BlackBox.Types: instance Data.Hashable.Class.Hashable Clash.Netlist.BlackBox.Types.EscapedSymbol
+ Clash.Netlist.BlackBox.Types: instance GHC.Classes.Eq Clash.Netlist.BlackBox.Types.EscapedSymbol
+ Clash.Netlist.BlackBox.Types: instance GHC.Generics.Generic Clash.Netlist.BlackBox.Types.EscapedSymbol
+ Clash.Netlist.BlackBox.Types: instance GHC.Show.Show Clash.Netlist.BlackBox.Types.EscapedSymbol
+ Clash.Netlist.BlackBox.Util: addFilePath :: [FilePath] -> Map FilePath FileName -> FilePath -> (Map FilePath FileName, FileName)
+ Clash.Netlist.BlackBox.Util: canonicalizeDataFilePath :: [FilePath] -> FilePath -> FilePath
+ Clash.Primitives.DSL: instance Data.Default.Internal.Default Clash.Primitives.DSL.BlackBoxHaskellOpts
+ Clash.Util: namePat :: Name -> Q Pat
+ GHC.BasicTypes.Extra: instance Control.DeepSeq.NFData GHC.Types.Basic.InlineSpec
+ GHC.BasicTypes.Extra: instance Control.DeepSeq.NFData GHC.Types.SourceText.SourceText
+ GHC.BasicTypes.Extra: instance Data.Binary.Class.Binary GHC.Types.Basic.InlineSpec
+ GHC.BasicTypes.Extra: instance Data.Binary.Class.Binary GHC.Types.SourceText.SourceText
+ GHC.BasicTypes.Extra: instance GHC.Generics.Generic GHC.Types.Basic.InlineSpec
+ GHC.BasicTypes.Extra: instance GHC.Generics.Generic GHC.Types.SourceText.SourceText
- Clash.Backend.Verilog: exprLit :: Lens' s (Maybe (Maybe Int)) -> Maybe (HWType, Size) -> Literal -> Ap (State s) Doc
+ Clash.Backend.Verilog: exprLit :: Backend s => Lens' s (Maybe (Maybe Int)) -> Maybe (HWType, Size) -> Literal -> Ap (State s) Doc
- Clash.Core.FreeVars: typeFreeVars' :: (Contravariant f, Applicative f) => (forall b. Var b -> Bool) -> IntSet -> (Var a -> f (Var a)) -> Type -> f Type
+ Clash.Core.FreeVars: typeFreeVars' :: (Contravariant f, Applicative f) => (forall b. Var b -> Bool) -> Word64Set -> (Var a -> f (Var a)) -> Type -> f Type
- Clash.Data.UniqMap: UniqMap :: IntMap a -> UniqMap a
+ Clash.Data.UniqMap: UniqMap :: Word64Map a -> UniqMap a
- Clash.Data.UniqMap: [uniqMapToIntMap] :: UniqMap a -> IntMap a
+ Clash.Data.UniqMap: [uniqMapToIntMap] :: UniqMap a -> Word64Map a
- Clash.Driver: copyDataFiles :: [FilePath] -> FilePath -> [(FilePath, FilePath)] -> IO [ByteString]
+ Clash.Driver: copyDataFiles :: FilePath -> [(FilePath, FilePath)] -> IO [ByteString]
- Clash.Netlist.BlackBox.Types: type BlackBoxFunction = Bool " Indicates whether caller needs a declaration. If set, the function is still free to return an expression, but the caller will convert it to a declaration." -> Text " Name of primitive" -> [Either Term Type] " Arguments" -> [Type] " Result types" -> NetlistMonad (Either String (BlackBoxMeta, BlackBox))
+ Clash.Netlist.BlackBox.Types: type BlackBoxFunction = -- | Indicates whether caller needs a declaration. If set, the function is -- still free to return an expression, but the caller will convert it to a -- declaration. Bool -> -- | Name of primitive Text -> -- | Arguments [Either Term Type] -> -- | Result types [Type] -> NetlistMonad (Either String (BlackBoxMeta, BlackBox))
- Clash.Rewrite.Types: bindings :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) BindingMap
+ Clash.Rewrite.Types: bindings :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) BindingMap
- Clash.Rewrite.Types: curFun :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) (Id, SrcSpan)
+ Clash.Rewrite.Types: curFun :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) (Id, SrcSpan)
- Clash.Rewrite.Types: extra :: forall extra_a4n9o extra_a4nha. Lens (RewriteState extra_a4n9o) (RewriteState extra_a4nha) extra_a4n9o extra_a4nha
+ Clash.Rewrite.Types: extra :: forall extra_a4GGi extra_a4GRB. Lens (RewriteState extra_a4GGi) (RewriteState extra_a4GRB) extra_a4GGi extra_a4GRB
- Clash.Rewrite.Types: globalHeap :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) PrimHeap
+ Clash.Rewrite.Types: globalHeap :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) PrimHeap
- Clash.Rewrite.Types: nameCounter :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) Int
+ Clash.Rewrite.Types: nameCounter :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) Int
- Clash.Rewrite.Types: transformCounter :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) Word
+ Clash.Rewrite.Types: transformCounter :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) Word
- Clash.Rewrite.Types: transformCounters :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) (HashMap Text Word)
+ Clash.Rewrite.Types: transformCounters :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) (HashMap Text Word)
- Clash.Rewrite.Types: uniqSupply :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) Supply
+ Clash.Rewrite.Types: uniqSupply :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) Supply
- Clash.Rewrite.Types: workFreeBinders :: forall extra_a4n9o. Lens' (RewriteState extra_a4n9o) (VarEnv Bool)
+ Clash.Rewrite.Types: workFreeBinders :: forall extra_a4GGi. Lens' (RewriteState extra_a4GGi) (VarEnv Bool)
- Clash.Unique: type Unique = Int
+ Clash.Unique: type Unique = Word64
- Clash.Unique: type Unique# = Int#
+ Clash.Unique: type Unique# = Word64#
- Clash.Util: data SrcSpan
+ Clash.Util: data () => SrcSpan
- Clash.Util: hoistMaybe :: Applicative m => Maybe b -> MaybeT m b
+ Clash.Util: hoistMaybe :: forall (m :: Type -> Type) b. Applicative m => Maybe b -> MaybeT m b
- Data.Text.Prettyprint.Doc.Extra: data PageWidth
+ Data.Text.Prettyprint.Doc.Extra: data () => PageWidth
- Data.Text.Prettyprint.Doc.Extra: newtype LayoutOptions
+ Data.Text.Prettyprint.Doc.Extra: newtype () => LayoutOptions

Files

CHANGELOG.md view
@@ -1,5 +1,47 @@ # Changelog for the Clash project +## 1.8.3 *Oct 6th 2025*++Added:+* `Counter` instances for `Bool`, `Bit`, `Int`, `Int8`, `Int16`, `Int32`, `Int64`, `Word`, `Word8`, `Word16`, `Word32`, `Word64`, `Identity` and `Maybe`. [#2692](https://github.com/clash-lang/clash-compiler/pull/2692)+* The Vec type now has a [COMPLETE pragma](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/pragmas.html#complete-pragma) to avoid incomplete pattern matches when using the `(:>)` pattern. [#3020](https://github.com/clash-lang/clash-compiler/pull/3020)+* RamOp now has an AutoReg instance. [#2792](https://github.com/clash-lang/clash-compiler/pull/2792)+* Added instance `NFDataX (SimOnly a)` [#2900](https://github.com/clash-lang/clash-compiler/pull/2900)+* Support for GHC 9.10 on Windows (macOS and Linux were already supported) [#2945](https://github.com/clash-lang/clash-compiler/pull/2945)+* Added a `BitPack` instance for `Char` [#2957](https://github.com/clash-lang/clash-compiler/pull/2957)+* Support for GHC 9.10.2 [#3003](https://github.com/clash-lang/clash-compiler/pull/3003)++Changed:+* Functions defined on `Clash.Class.Counter` are now public [#2692](https://github.com/clash-lang/clash-compiler/pull/2692)++Fixed:+* Clash hanging when rendering `Index n` literals, for large values of `n` [#2813](https://github.com/clash-lang/clash-compiler/issues/2813)+* Render overflowed Index literals as don't-cares in HDL [#2970](https://github.com/clash-lang/clash-compiler/pull/2970)+* Clash errors out when `Clash.Sized.Vector.splitAt` is compile-time evaluated in an illegal context [#2831]https://github.com/clash-lang/clash-compiler/issues/2831+* `Clash.Explicit.DDR`: [#2911](https://github.com/clash-lang/clash-compiler/pull/2911)+  - `ddrIn`: VHDL: Remove data input from sensitivity list of `ddrIn_neg_latch` register as it is superfluous. This should not affect functionality.+  - `ddrOut`: VHDL: Fix incorrect usage of `Enable` input when the domain is set to asynchronous resets. Deasserting the `Enable` exhibited wrong behavior before this fix.+* `Clash.Xilinx.DDR`: [#2911](https://github.com/clash-lang/clash-compiler/pull/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 `iddr` and `oddr` were renamed to match their function.+* `Clash.Intel.DDR`: [#2911](https://github.com/clash-lang/clash-compiler/pull/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.+* `makeTopEntity` now accounts for `SimOnly` constructs. This can prevent warnings in situtations where the `SimOnly` type would contain types `makeTopEntity` cannot handle. [#2897](https://github.com/clash-lang/clash-compiler/pull/2897)+* Clash did not build on GHC 9.6.7 (but did on 9.6.6) [#2916](https://github.com/clash-lang/clash-compiler/issues/2916)+* Ignore `Tick`s in `TermLiteral Integer`, `TermLiteral Char`, `TermLiteral Natural`, and `TermLiteral (SNat n)` [#2925](https://github.com/clash-lang/clash-compiler/pull/2925)+* Fixed laziness issue in internal black box `imap_go` [#2542](https://github.com/clash-lang/clash-compiler/issues/2542)+* Clash's evaluator now uses `TemplateHaskell` names to detect renamed symbols in `GHC.*` and `Clash.*`. Fixes errors similar to `No blackbox found for: GHC.Internal.Base.eqString` [#2972](https://github.com/clash-lang/clash-compiler/issues/2972)+* No blackbox found for: `GHC.Internal.Control.Exception.Base.recSelError` on GHC 9.10 [#2966](https://github.com/clash-lang/clash-compiler/issues/2966)+* Verilog and System Verilog code gen bug for `map head` [#2809](https://github.com/clash-lang/clash-compiler/issues/2809)+* Error parsing blackbox: `Clash.Sized.Vector.head` [#2988](https://github.com/clash-lang/clash-compiler/issues/2988)+* Clash no longer duplicates included datafiles when component is instantiated multiple times [#3008](https://github.com/clash-lang/clash-compiler/issues/3008)+* Clash will no longer emit "no blackbox found for" `GHC.Real`'s exponentiation function if it is applied to constants [#3010](https://github.com/clash-lang/clash-compiler/pull/3010)+* Clash will no longer error out when converting `ensureSpine` on Clash number types to HDL [#3021](https://github.com/clash-lang/clash-compiler/issues/3021)+* Clash will no longer ignore Synthesize annotations when the function is used in an argument position [#3024](https://github.com/clash-lang/clash-compiler/issues/3024)+ ## 1.8.2 *Jan 3rd 2025*  Added:
README.md view
@@ -24,5 +24,13 @@    * Support for multiple clock domains, with type safe clock domain crossing. -# Support-For updates and questions join the mailing list clash-language+subscribe@googlegroups.com or read the [forum](https://groups.google.com/d/forum/clash-language)+# Open-source community+Clash benefits from an active community. Whether you need a question answered or+want to contribute to open-source features, browse the features below to make+the most of Clash.++- [Discourse: long form discussions and questions](https://clash-lang.discourse.group/)+- [Discord: short form discussions and community chat room](https://discord.gg/rebGq25FB4)+- [Slack: short form discussions and questions](https://functionalprogramming.slack.com/archives/CPGMJFF50)+  (Invite yourself at [fpslack.com](https://fpslack.com))+- [Github: issue tracker](https://github.com/clash-lang/clash-compiler/issues)
clash-lib.cabal view
@@ -1,6 +1,6 @@ Cabal-version:        2.2 Name:                 clash-lib-Version:              1.8.2+Version:              1.8.3 Synopsis:             Clash: a functional hardware description language - As a library Description:   Clash is a functional hardware description language that borrows both its@@ -151,16 +151,16 @@                       base16-bytestring       >= 0.1.1    && < 1.1,                       binary                  >= 0.8.5    && < 0.11,                       bytestring              >= 0.10.0.2 && < 0.13,-                      clash-prelude           == 1.8.2,+                      clash-prelude           == 1.8.3,                       containers              >= 0.5.0.0  && < 0.8,                       cryptohash-sha256       >= 0.11     && < 0.12,                       data-binary-ieee754     >= 0.4.4    && < 0.6,-                      data-default            >= 0.7      && < 0.8,+                      data-default            >= 0.7      && < 0.9,                       deepseq                 >= 1.3.0.2  && < 1.6,                       dlist                   >= 0.8      && < 1.1,                       directory               >= 1.2.0.1  && < 1.4,                       exceptions              >= 0.8.3    && < 0.11.0,-                      extra                   >= 1.6.17   && < 1.8,+                      extra                   >= 1.6.17   && < 1.9,                       filepath                >= 1.3.0.1  && < 1.6,                       ghc                     >= 8.6.0    && < 9.11,                       ghc-boot-th,
+ prims/common/GHC_Internal_Control_Exception_Base.primitives.yaml view
@@ -0,0 +1,63 @@+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.recSelError+    kind: Expression+    type: 'recSelError ::+      Addr# -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.recConError+    kind: Expression+    type: 'recConError ::+      Addr# -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.irrefutPatError+    kind: Expression+    type: 'irrefutPatError+      :: Addr# -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.runtimeError+    kind: Expression+    type: 'runtimeError ::+      Addr# -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.nonExhaustiveGuardsError+    kind: Expression+    type: 'nonExhaustiveGuardsError+      :: Addr# -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.patError+    kind: Expression+    type: 'patError :: Addr#+      -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.noMethodBindingError+    kind: Expression+    type: 'noMethodBindingError+      :: Addr# -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.absentError+    kind: Expression+    type: 'absentError ::+      Addr# -> a'+    template: ~ERRORO+    workInfo: Constant+- BlackBox:+    name: GHC.Internal.Control.Exception.Base.typeError+    kind: Expression+    type: 'typeError :: Addr#+      -> a'+    template: ~ERRORO+    workInfo: Constant
+ prims/commonverilog/Clash_Class_BitPack.primitives.yaml view
@@ -0,0 +1,12 @@+- BlackBox:+    name: Clash.Class.BitPack.Internal.packChar#+    kind: Expression+    type: 'packChar# :: Char -> BitVector 21'+    template: ~ARG[0]+    workInfo: Never+- BlackBox:+    name: Clash.Class.BitPack.Internal.unpackChar#+    kind: Expression+    type: 'unpackChar# :: BitVector 21 -> Char'+    template: ~ARG[0]+    workInfo: Never
prims/systemverilog/Clash_Intel_DDR.primitives.yaml view
@@ -1,10 +1,10 @@ - BlackBox:-    name: Clash.Intel.DDR.altddioIn+    name: Clash.Intel.DDR.altddioIn#     kind: Declaration     libraries:     - altera_mf     type: |--      altddioIn+      altddioIn#         :: ( HasCallStack               -- ARG[0]            , KnownConfi~ fast domf      -- ARG[1]            , KnownConfi~ slow doms      -- ARG[2]@@ -36,7 +36,7 @@           .sclr (1'b0),~FI           .datain (~ARG[8]),           .inclock (~ARG[5]),-          .inclocken (~IF ~ISACTIVEENABLE[7] ~THEN~ARG[7]~ELSE1'b1,~FI),+          .inclocken (~IF ~ISACTIVEENABLE[7] ~THEN~ARG[7]~ELSE1'b1~FI),           .dataout_h (~SYM[2]),           .dataout_l (~SYM[1]),           .aset (1'b0),
prims/systemverilog/Clash_Sized_Vector.primitives.yaml view
@@ -1,29 +1,25 @@ - BlackBox:     name: Clash.Sized.Vector.head     kind: Expression-    type: 'head :: Vec (n-      + 1) a -> a'+    type: 'head :: Vec (n + 1) a -> a'     template: ~FROMBV[~VAR[vec][0][\0\]][~TYPO]     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.tail     kind: Expression-    type: 'tail :: Vec (n-      + 1) a -> Vec n a'+    type: 'tail :: Vec (n + 1) a -> Vec n a'     template: '~VAR[vec][0][1 : $high(~VAR[vec][0])]'     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.last     kind: Expression-    type: Vec (n + 1) a ->-      a+    type: Vec (n + 1) a -> a     template: ~FROMBV[~VAR[vec][0][\$high(~VAR[vec][0])\]][~TYPO]     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.init     kind: Expression-    type: Vec (n + 1) a ->-      Vec n a+    type: Vec (n + 1) a -> Vec n a     template: '~VAR[vec][0][0 : $high(~VAR[vec][0]) - 1]'     workInfo: Never - BlackBox:@@ -49,15 +45,13 @@ - BlackBox:     name: Clash.Sized.Vector.++     kind: Expression-    type: '(++) :: Vec n a-      -> Vec m a -> Vec (n + m) a'+    type: '(++) :: Vec n a -> Vec m a -> Vec (n + m) a'     template: ~FROMBV[{~TOBV[~ARG[0]][~TYP[0]],~TOBV[~ARG[1]][~TYP[1]]}][~TYPO]     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.concat     kind: Declaration-    type: 'concat :: Vec n-      (Vec m a) -> Vec (n * m) a'+    type: 'concat :: Vec n (Vec m a) -> Vec (n * m) a'     template: |-       // concat begin       genvar ~GENSYM[n][1];@@ -71,8 +65,7 @@ - BlackBox:     name: Clash.Sized.Vector.splitAt     kind: Declaration-    type: 'splitAt :: SNat-      m -> Vec (m + n) a -> (Vec m a, Vec n a)'+    type: 'splitAt :: SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)'     template: |-       // splitAt begin~IF~LENGTH[~TYPO]~THEN       assign ~RESULT = ~ARG[1];~ELSE@@ -110,8 +103,7 @@ - BlackBox:     name: Clash.Sized.Vector.map     kind: Declaration-    type: 'map :: (a -> b)-      -> Vec n a -> Vec n b'+    type: 'map :: (a -> b) -> Vec n a -> Vec n b'     template: |-       // map begin       genvar ~GENSYM[n][1];@@ -132,8 +124,7 @@ - BlackBox:     name: Clash.Sized.Vector.imap     kind: Declaration-    type: 'imap :: KnownNat-      n => (Index n -> a -> b) -> Vec n a -> Vec n b'+    type: 'imap :: KnownNat n => (Index n -> a -> b) -> Vec n a -> Vec n b'     template: |-       // imap begin       genvar ~GENSYM[n][1];@@ -157,22 +148,21 @@ - BlackBox:     name: Clash.Sized.Vector.imap_go     kind: Declaration-    type: 'imap_go :: Index-      n -> (Index n -> a -> b) -> Vec m a -> Vec m b'+    type: 'imap_go :: (Index n -> a -> b) -> Vec m a -> Index n -> Vec m b'     template: |-       // imap begin       genvar ~GENSYM[n][1];       ~GENERATE       for (~SYM[1]=0; ~SYM[1] < $size(~RESULT); ~SYM[1] = ~SYM[1] + 1) begin : ~GENSYM[imap][2]-        ~TYP[0] ~GENSYM[i][3];-        assign ~SYM[3] = ~SYM[1] + ~ARG[0];~IF~SIZE[~TYP[2]]~THEN-        ~TYPEL[~TYP[2]] ~GENSYM[imap_in][4];-        assign ~SYM[4] = ~FROMBV[~VAR[vec][2][\~SYM[1]\]][~TYPEL[~TYP[2]]];~ELSE ~FI+        ~TYP[2] ~GENSYM[i][3];+        assign ~SYM[3] = ~SYM[1] + ~ARG[2];~IF~SIZE[~TYP[1]]~THEN+        ~TYPEL[~TYP[1]] ~GENSYM[imap_in][4];+        assign ~SYM[4] = ~FROMBV[~VAR[vec][1][\~SYM[1]\]][~TYPEL[~TYP[1]]];~ELSE ~FI         ~TYPEL[~TYPO] ~GENSYM[imap_out][5];-        ~INST 1+        ~INST 0           ~OUTPUT <= ~SYM[5]~ ~TYPEL[~TYPO]~-          ~INPUT  <= ~SYM[3]~ ~TYP[0]~-          ~INPUT  <= ~SYM[4]~ ~TYPEL[~TYP[2]]~+          ~INPUT  <= ~SYM[3]~ ~TYP[2]~+          ~INPUT  <= ~SYM[4]~ ~TYPEL[~TYP[1]]~         ~INST         assign ~RESULT[~SYM[1]] = ~TOBV[~SYM[5]][~TYPEL[~TYPO]];       end@@ -182,8 +172,7 @@ - BlackBox:     name: Clash.Sized.Vector.zipWith     kind: Declaration-    type: 'zipWith :: (a ->-      b -> c) -> Vec n a -> Vec n b -> Vec n c'+    type: 'zipWith :: (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c'     template: |-       // zipWith begin       genvar ~GENSYM[n][2];@@ -207,8 +196,7 @@ - BlackBox:     name: Clash.Sized.Vector.foldr     kind: Declaration-    type: 'foldr :: (a ->-      b -> b) -> b -> Vec n a -> b'+    type: 'foldr :: (a -> b -> b) -> b -> Vec n a -> b'     template: |-       // foldr start~IF ~LENGTH[~TYP[2]] ~THEN       ~SIGDO[~GENSYM[intermediate][0]] [0:~LENGTH[~TYP[2]]];@@ -235,15 +223,13 @@ - BlackBox:     name: Clash.Sized.Vector.index_int     kind: Expression-    type: 'index_int :: KnownNat-      n => Vec n a -> Int -> a'+    type: 'index_int :: KnownNat n => Vec n a -> Int -> a'     template: ~IF~SIZE[~TYP[1]]~THEN~FROMBV[~VAR[vec][1][\~ARG[2]\]][~TYPO]~ELSE~ERRORO~FI - BlackBox:     name: Clash.Sized.Vector.replace_int     kind: Declaration     outputUsage: Blocking-    type: 'replace_int ::-      KnownNat n => Vec n a -> Int -> a -> Vec n a'+    type: 'replace_int :: KnownNat n => Vec n a -> Int -> a -> Vec n a'     template: |-       // replaceVec start       always_comb begin@@ -254,15 +240,13 @@ - BlackBox:     name: Clash.Sized.Vector.replicate     kind: Expression-    type: 'replicate :: SNat-      n -> a -> Vec n a'-    template: '''{~LIT[0] {~TOBV[~ARG[1]][~TYP[1]]}}'+    type: 'replicate :: SNat n -> a -> Vec n a'+    template: "'{~LIT[0] {~TOBV[~ARG[1]][~TYP[1]]}}"     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.transpose     kind: Declaration-    type: 'transpose :: KnownNat-      n => Vec m (Vec n a) -> Vec n (Vec m a)'+    type: 'transpose :: KnownNat n => Vec m (Vec n a) -> Vec n (Vec m a)'     template: |-       // transpose begin       genvar ~GENSYM[row_index][1];@@ -280,8 +264,7 @@ - BlackBox:     name: Clash.Sized.Vector.reverse     kind: Declaration-    type: 'reverse :: Vec-      n a -> Vec n a'+    type: 'reverse :: Vec n a -> Vec n a'     template: |-       // reverse begin       genvar ~GENSYM[n][1];@@ -313,8 +296,7 @@ - BlackBox:     name: Clash.Sized.Vector.rotateLeftS     kind: Declaration-    type: 'rotateLeftS ::-      KnownNat n => Vec n a -> SNat d -> Vec n a'+    type: 'rotateLeftS :: KnownNat n => Vec n a -> SNat d -> Vec n a'     template: |-       // rotateLeftS begin       localparam ~GENSYM[shift_amount][2] = ~LIT[2] % ~LIT[0];@@ -332,8 +314,7 @@ - BlackBox:     name: Clash.Sized.Vector.rotateRightS     kind: Declaration-    type: 'rotateRightS ::-      KnownNat n => Vec n a -> SNat d -> Vec n a'+    type: 'rotateRightS :: KnownNat n => Vec n a -> SNat d -> Vec n a'     template: |-       // rotateRightS begin       localparam ~GENSYM[shift_amount][2] = ~LIT[2] % ~LIT[0];
prims/systemverilog/Clash_Xilinx_DDR.primitives.yaml view
@@ -1,8 +1,8 @@ - BlackBox:-    name: Clash.Xilinx.DDR.iddr+    name: Clash.Xilinx.DDR.iddr#     kind: Declaration     type: |--      iddr+      iddr#         :: ( HasCallStack               -- ARG[0]            , KnownConfi~ fast domf      -- ARG[1]            , KnownConfi~ slow doms      -- ARG[2]@@ -14,8 +14,8 @@         -> Signal slow (BitVector m,BitVector m)     template: |-       // iddr begin-      ~SIGD[~GENSYM[dataout_l][1]][7];-      ~SIGD[~GENSYM[dataout_h][2]][7];+      ~SIGD[~GENSYM[data_pos][1]][7];+      ~SIGD[~GENSYM[data_neg][2]][7];       ~SIGD[~GENSYM[d][3]][7];       assign ~SYM[3] = ~ARG[7]; @@ -57,8 +57,8 @@         -> Signal fast (BitVector m)     template: |-       // oddr begin-      ~SIGD[~GENSYM[datain_l][1]][7];-      ~SIGD[~GENSYM[datain_h][2]][7];+      ~SIGD[~GENSYM[data_pos][1]][7];+      ~SIGD[~GENSYM[data_neg][2]][7];       ~SIGD[~GENSYM[q][3]][7];        assign ~SYM[1] = ~ARG[6];@@ -70,7 +70,7 @@         ODDR #(           .DDR_CLK_EDGE("SAME_EDGE"),           .INIT(1'b0),-          .SRTYPE(~IF ~ISSYNC[2] ~THEN "SYNC" ~ELSE "ASYNC" ~FI)+          .SRTYPE(~IF ~ISSYNC[1] ~THEN "SYNC" ~ELSE "ASYNC" ~FI)         ) ~GENSYM[~COMPNAME_ODDR][9] (           .Q(~SYM[3][~SYM[8]]),           .C(~ARG[3]),
prims/verilog/Clash_Intel_DDR.primitives.yaml view
@@ -1,10 +1,10 @@ - BlackBox:-    name: Clash.Intel.DDR.altddioIn+    name: Clash.Intel.DDR.altddioIn#     kind: Declaration     libraries:     - altera_mf     type: |--      altddioIn+      altddioIn#         :: ( HasCallStack               -- ARG[0]            , KnownConfi~ fast domf      -- ARG[1]            , KnownConfi~ slow doms      -- ARG[2]@@ -27,7 +27,7 @@           .lpm_hint ("UNUSED"),           .lpm_type ("altddio_in"),           .power_up_high ("OFF"),-          .width (~SIZE[~TYP[7]])+          .width (~SIZE[~TYP[8]])         )         ~GENSYM[~COMPNAME_ALTDDIO_IN][7] (~IF ~ISSYNC[2] ~THEN           .sclr (~ARG[6]),
prims/verilog/Clash_Sized_Vector.primitives.yaml view
@@ -1,29 +1,25 @@ - BlackBox:     name: Clash.Sized.Vector.head     kind: Expression-    type: 'head :: Vec (n-      + 1) a -> a'+    type: 'head :: Vec (n + 1) a -> a'     template: '~FROMBV[~VAR[vec][0][\~SIZE[~TYP[0]]-1 -: ~SIZE[~TYPO]\]][~TYPO]'     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.tail     kind: Expression-    type: 'tail :: Vec (n-      + 1) a -> Vec n a'+    type: 'tail :: Vec (n + 1) a -> Vec n a'     template: '~VAR[vec][0][~SIZE[~TYPO]-1 : 0]'     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.last     kind: Expression-    type: Vec (n + 1) a ->-      a+    type: Vec (n + 1) a -> a     template: ~FROMBV[~VAR[vec][0][\~SIZE[~TYPO]-1:0\]][~TYPO]     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.init     kind: Expression-    type: Vec (n + 1) a ->-      Vec n a+    type: Vec (n + 1) a -> Vec n a     template: '~VAR[vec][0][~SIZE[~TYP[0]]-1 : ~SIZE[~TYPEL[~TYP[0]]]]'     workInfo: Never - BlackBox:@@ -57,22 +53,19 @@ - BlackBox:     name: Clash.Sized.Vector.++     kind: Expression-    type: '(++) :: Vec n a-      -> Vec m a -> Vec (n + m) a'+    type: '(++) :: Vec n a -> Vec m a -> Vec (n + m) a'     template: '{~ARG[0],~ARG[1]}'     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.concat     kind: Expression-    type: 'concat :: Vec n-      (Vec m a) -> Vec (n * m) a'+    type: 'concat :: Vec n (Vec m a) -> Vec (n * m) a'     template: ~ARG[0]     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.splitAt     kind: Expression-    type: 'splitAt :: SNat-      m -> Vec (m + n) a -> (Vec m a, Vec n a)'+    type: 'splitAt :: SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)'     template: ~ARG[1]     workInfo: Never - BlackBox:@@ -88,8 +81,7 @@ - BlackBox:     name: Clash.Sized.Vector.map     kind: Declaration-    type: 'map :: (a -> b)-      -> Vec n a -> Vec n b'+    type: 'map :: (a -> b) -> Vec n a -> Vec n b'     template: |-       // map begin       genvar ~GENSYM[i][1];@@ -110,8 +102,7 @@ - BlackBox:     name: Clash.Sized.Vector.imap     kind: Declaration-    type: 'imap :: KnownNat-      n => (Index n -> a -> b) -> Vec n a -> Vec n b'+    type: 'imap :: KnownNat n => (Index n -> a -> b) -> Vec n a -> Vec n b'     template: |-       // imap begin       genvar ~GENSYM[i][1];@@ -136,23 +127,22 @@ - BlackBox:     name: Clash.Sized.Vector.imap_go     kind: Declaration-    type: 'imap :: Index n-      -> (Index n -> a -> b) -> Vec m a -> Vec m b'+    type: 'imap_go :: (Index n -> a -> b) -> Vec m a -> Index n -> Vec m b'     template: |-       // imap begin       genvar ~GENSYM[i][1];       ~GENERATE       for (~SYM[1]=0; ~SYM[1] < ~LENGTH[~TYPO]; ~SYM[1] = ~SYM[1] + 1) begin : ~GENSYM[imap][2]-        wire ~TYP[0] ~GENSYM[map_index][3];~IF~SIZE[~TYP[2]]~THEN-        wire ~TYPEL[~TYP[2]] ~GENSYM[map_in][4];-        assign ~SYM[4] = ~VAR[vec][2][~SYM[1]*~SIZE[~TYPEL[~TYP[2]]]+:~SIZE[~TYPEL[~TYP[2]]]];~ELSE ~FI-        ~OUTPUTUSAGE[1] ~TYPEL[~TYPO] ~GENSYM[map_out][5];+        wire ~TYP[2] ~GENSYM[map_index][3];~IF~SIZE[~TYP[1]]~THEN+        wire ~TYPEL[~TYP[1]] ~GENSYM[map_in][4];+        assign ~SYM[4] = ~VAR[vec][1][~SYM[1]*~SIZE[~TYPEL[~TYP[1]]]+:~SIZE[~TYPEL[~TYP[1]]]];~ELSE ~FI+        ~OUTPUTUSAGE[0] ~TYPEL[~TYPO] ~GENSYM[map_out][5]; -        assign ~SYM[3] = ~SIZE[~TYP[0]]'d~MAXINDEX[~TYPO] - ~SYM[1][0+:~SIZE[~TYP[0]]] + ~ARG[0];-        ~INST 1+        assign ~SYM[3] = ~SIZE[~TYP[2]]'d~MAXINDEX[~TYPO] - ~SYM[1][0+:~SIZE[~TYP[2]]] + ~ARG[2];+        ~INST 0           ~OUTPUT <= ~SYM[5]~ ~TYPEL[~TYPO]~-          ~INPUT  <= ~SYM[3]~ ~TYP[0]~-          ~INPUT  <= ~SYM[4]~ ~TYPEL[~TYP[2]]~+          ~INPUT  <= ~SYM[3]~ ~TYP[2]~+          ~INPUT  <= ~SYM[4]~ ~TYPEL[~TYP[1]]~         ~INST         assign ~RESULT[~SYM[1]*~SIZE[~TYPEL[~TYPO]]+:~SIZE[~TYPEL[~TYPO]]] = ~SYM[5];       end@@ -162,8 +152,7 @@ - BlackBox:     name: Clash.Sized.Vector.zipWith     kind: Declaration-    type: 'zipWith :: (a ->-      b -> c) -> Vec n a -> Vec n b -> Vec n c'+    type: 'zipWith :: (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c'     template: |-       // zipWith start       genvar ~GENSYM[i][2];@@ -187,8 +176,7 @@ - BlackBox:     name: Clash.Sized.Vector.foldr     kind: Declaration-    type: 'foldr :: (a ->-      b -> b) -> b -> Vec n a -> b'+    type: 'foldr :: (a -> b -> b) -> b -> Vec n a -> b'     template: |-       // foldr start~IF ~LENGTH[~TYP[2]] ~THEN       wire ~TYPO ~GENSYM[intermediate][0] [0:~LENGTH[~TYP[2]]];@@ -223,8 +211,7 @@ - BlackBox:     name: Clash.Sized.Vector.replace_int     kind: Declaration-    type: 'replace_int ::-      KnownNat n => Vec n a -> Int -> a -> Vec n a'+    type: 'replace_int :: KnownNat n => Vec n a -> Int -> a -> Vec n a'     template: |-       // vector replace begin       genvar ~GENSYM[i][0];@@ -237,29 +224,25 @@ - BlackBox:     name: Clash.Sized.Vector.maxIndex     kind: Expression-    type: 'maxIndex :: KnownNat-      n => Vec n a -> Int'+    type: 'maxIndex :: KnownNat n => Vec n a -> Int'     template: ~SIZE[~TYPO]'sd~LIT[0] - ~SIZE[~TYPO]'d1     workInfo: Constant - BlackBox:     name: Clash.Sized.Vector.length     kind: Expression-    type: 'length :: KnownNat-      n => Vec n a -> Int'+    type: 'length :: KnownNat n => Vec n a -> Int'     template: ~SIZE[~TYPO]'sd~LIT[0]     workInfo: Constant - BlackBox:     name: Clash.Sized.Vector.replicate     kind: Expression-    type: 'replicate :: SNat-      n -> a -> Vec n a'+    type: 'replicate :: SNat n -> a -> Vec n a'     template: '{~LIT[0] {~ARG[1]}}'     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.transpose     kind: Declaration-    type: 'transpose :: KnownNat-      n => Vec m (Vec n a) -> Vec n (Vec m a)'+    type: 'transpose :: KnownNat n => Vec m (Vec n a) -> Vec n (Vec m a)'     template: |-       // transpose begin       genvar ~GENSYM[row_index][1];@@ -276,8 +259,7 @@ - BlackBox:     name: Clash.Sized.Vector.reverse     kind: Declaration-    type: 'reverse :: Vec-      n a -> Vec n a'+    type: 'reverse :: Vec n a -> Vec n a'     template: |-       // reverse begin       genvar ~GENSYM[i][1];@@ -309,8 +291,7 @@ - BlackBox:     name: Clash.Sized.Vector.rotateLeftS     kind: Declaration-    type: 'rotateLeftS ::-      KnownNat n => Vec n a -> SNat d -> Vec n a'+    type: 'rotateLeftS :: KnownNat n => Vec n a -> SNat d -> Vec n a'     template: |-       // rotateLeftS begin       localparam ~GENSYM[shift_amount][2] = ~LIT[2] % ~LIT[0];@@ -329,8 +310,7 @@ - BlackBox:     name: Clash.Sized.Vector.rotateRightS     kind: Declaration-    type: 'rotateRightS ::-      KnownNat n => Vec n a -> SNat d -> Vec n a'+    type: 'rotateRightS :: KnownNat n => Vec n a -> SNat d -> Vec n a'     template: |-       // rotateRightS begin       localparam ~GENSYM[shift_amount][2] = ~LIT[2] % ~LIT[0];
prims/verilog/Clash_Xilinx_DDR.primitives.yaml view
@@ -1,8 +1,8 @@ - BlackBox:-    name: Clash.Xilinx.DDR.iddr+    name: Clash.Xilinx.DDR.iddr#     kind: Declaration     type: |--      iddr+      iddr#         :: ( HasCallStack            -- ARG[0]            , KnownConfi~ fast domf   -- ARG[1]            , KnownConfi~ slow doms   -- ARG[2]@@ -14,8 +14,8 @@         -> Signal slow (BitVector m,BitVector m)     template: |-       // iddr begin-      wire ~SIGD[~GENSYM[dataout_l][1]][7];-      wire ~SIGD[~GENSYM[dataout_h][2]][7];+      wire ~SIGD[~GENSYM[data_pos][1]][7];+      wire ~SIGD[~GENSYM[data_neg][2]][7];       wire ~SIGD[~GENSYM[d][3]][7];       assign ~SYM[3] = ~ARG[7]; @@ -57,8 +57,8 @@         -> Signal fast (BitVector m)     template: |-       // oddr begin-      wire ~SIGD[~GENSYM[datain_l][1]][7];-      wire ~SIGD[~GENSYM[datain_h][2]][7];+      wire ~SIGD[~GENSYM[data_pos][1]][7];+      wire ~SIGD[~GENSYM[data_neg][2]][7];       wire ~SIGD[~GENSYM[q][3]][7];        assign ~SYM[1] = ~ARG[6];
+ prims/vhdl/Clash_Class_BitPack.primitives.yaml view
@@ -0,0 +1,12 @@+- BlackBox:+    name: Clash.Class.BitPack.Internal.packChar#+    kind: Expression+    type: 'packChar# :: Char -> BitVector 21'+    template: std_logic_vector(~ARG[0])+    workInfo: Never+- BlackBox:+    name: Clash.Class.BitPack.Internal.unpackChar#+    kind: Expression+    type: 'unpackChar# :: BitVector 21 -> Char'+    template: unsigned(~ARG[0])+    workInfo: Never
prims/vhdl/Clash_Explicit_DDR.primitives.yaml view
@@ -60,7 +60,7 @@        ~ELSE         -- async         ---------------        ~SYM[6] : process(~ARG[4],~ARG[5]~VARS[9])+        ~SYM[6] : process(~ARG[4],~ARG[5])         begin           if ~ARG[5] = ~IF~ISACTIVEHIGH[2]~THEN'1'~ELSE'0'~FI then             ~SYM[1] <= ~ARG[8];@@ -69,7 +69,7 @@           end if;         end process; -        ~SYM[7] : process(~ARG[4],~ARG[5]~VARS[9])+        ~SYM[7] : process(~ARG[4],~ARG[5])         begin           if ~ARG[5] = ~IF~ISACTIVEHIGH[2]~THEN'1'~ELSE'0'~FI then             ~SYM[2] <= ~ARG[9];@@ -78,7 +78,7 @@           end if;         end process; -        ~SYM[8] : process(~ARG[4],~ARG[5],~SYM[2])+        ~SYM[8] : process(~ARG[4],~ARG[5])         begin           if ~ARG[5] = ~IF~ISACTIVEHIGH[2]~THEN'1'~ELSE'0'~FI then             ~SYM[3] <= ~ARG[7];@@ -107,7 +107,7 @@                -> Signal fast a     template: |-       -- ddrOut begin-      ~GENSYM[~COMPNAME_ddrIn][0] : block+      ~GENSYM[~COMPNAME_ddrOut][0] : block         signal ~GENSYM[data_Pos][1] : ~TYP[7];         signal ~GENSYM[data_Neg][2] : ~TYP[7];       begin@@ -142,7 +142,7 @@         begin           if ~ARG[5] = ~IF~ISACTIVEHIGH[2]~THEN'1'~ELSE'0'~FI then             ~SYM[1] <= ~ARG[7];-          elsif ~IF~ACTIVEEDGE[Rising][2]~THENrising_edge~ELSEfalling_edge~FI(~ARG[4]) then+          elsif ~IF ~ISACTIVEENABLE[6] ~THEN ~ARG[6] and ~ELSE ~FI ~IF~ACTIVEEDGE[Rising][2]~THENrising_edge~ELSEfalling_edge~FI(~ARG[4]) then             ~SYM[1] <= ~ARG[8];           end if;         end process;@@ -151,11 +151,11 @@         begin           if ~ARG[5] = ~IF~ISACTIVEHIGH[2]~THEN'1'~ELSE'0'~FI then             ~SYM[2] <= ~ARG[7];-          elsif ~IF~ACTIVEEDGE[Rising][2]~THENrising_edge~ELSEfalling_edge~FI(~ARG[4]) then+          elsif ~IF ~ISACTIVEENABLE[6] ~THEN ~ARG[6] and ~ELSE ~FI ~IF~ACTIVEEDGE[Rising][2]~THENrising_edge~ELSEfalling_edge~FI(~ARG[4]) then             ~SYM[2] <= ~ARG[9];           end if;         end process;        ~FI-        ~RESULT <= ~IF~ACTIVEEDGE[Rising][2]~THEN~SYM[1]~ELSE~SYM[2]~FI when (~ARG[4] = '1' ~IF ~ISACTIVEENABLE[6] ~THEN and ~ARG[6] ~ELSE ~FI) else ~IF~ACTIVEEDGE[Rising][2]~THEN~SYM[2]~ELSE~SYM[1]~FI;+        ~RESULT <= ~IF~ACTIVEEDGE[Rising][2]~THEN~SYM[1]~ELSE~SYM[2]~FI when (~ARG[4] = '1') else ~IF~ACTIVEEDGE[Rising][2]~THEN~SYM[2]~ELSE~SYM[1]~FI;       end block;       -- ddrOut end
prims/vhdl/Clash_Intel_DDR.primitives.yaml view
@@ -1,12 +1,12 @@ - BlackBox:-    name: Clash.Intel.DDR.altddioIn+    name: Clash.Intel.DDR.altddioIn#     imports:     - altera_mf.altera_mf_components.all     kind: Declaration     libraries:     - altera_mf     type: |--      altddioIn+      altddioIn#         :: ( HasCallStack               -- ARG[0]            , KnownConfi~ fast domf      -- ARG[1]            , KnownConfi~ slow doms      -- ARG[2]@@ -23,7 +23,7 @@         signal ~GENSYM[dataout_l][1] : ~TYP[8];         signal ~GENSYM[dataout_h][2] : ~TYP[8];~IF ~ISACTIVEENABLE[7] ~THEN         signal ~GENSYM[ce_logic][4]: std_logic;~ELSE ~FI-      begin~IF ~ISACTIVEENABLE[5] ~THEN+      begin~IF ~ISACTIVEENABLE[7] ~THEN         ~SYM[4] <= '1' when (~ARG[7]) else '0';~ELSE ~FI         ~GENSYM[~COMPNAME_ALTDDIO_IN][7] : ALTDDIO_IN         GENERIC MAP (@@ -37,7 +37,7 @@         PORT MAP (~IF ~ISSYNC[6] ~THEN           sclr      => ~ARG[6],~ELSE           aclr      => ~ARG[6],~FI-          datain    => ~ARG[8],~IF ~ISACTIVEENABLE[5] ~THEN+          datain    => ~ARG[8],~IF ~ISACTIVEENABLE[7] ~THEN           inclocken => ~SYM[4],~ELSE ~FI           inclock   => ~ARG[5],           dataout_h => ~SYM[2],@@ -71,7 +71,7 @@       ~GENSYM[~COMPNAME_ALTDDIO_OUT][0] : block ~IF ~ISACTIVEENABLE[7] ~THEN         signal ~GENSYM[ce_logic][1] : std_logic; ~ELSE ~FI       begin~IF ~ISACTIVEENABLE[7] ~THEN-        ~SYM[3] <= '1' when (~ARG[7]) else '0'; ~ELSE ~FI+        ~SYM[1] <= '1' when (~ARG[7]) else '0'; ~ELSE ~FI         ~GENSYM[~COMPNAME_ALTDDIO_OUT][7] : ALTDDIO_OUT           GENERIC MAP (             extend_oe_disable => "OFF",@@ -88,8 +88,8 @@             aclr       => ~ARG[6],~FI ~IF ~ISACTIVEENABLE[7] ~THEN             outclocken => ~SYM[1],~ELSE ~FI             outclock   => ~ARG[5],-            datain_h   => ~ARG[7],-            datain_l   => ~ARG[8],+            datain_h   => ~ARG[8],+            datain_l   => ~ARG[9],             dataout    => ~RESULT           );       end block;
prims/vhdl/Clash_Sized_Vector.primitives.yaml view
@@ -1,31 +1,27 @@ - BlackBox:     name: Clash.Sized.Vector.head     kind: Expression-    type: 'head :: Vec (n-      + 1) a -> a'+    type: 'head :: Vec (n + 1) a -> a'     template: ~IF ~VIVADO ~THEN ~TYPMO'(fromSLV(~VAR[vec][0](0))) ~ELSE ~VAR[vec][0](0)       ~FI     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.tail     kind: Expression-    type: 'tail :: Vec (n-      + 1) a -> Vec n a'+    type: 'tail :: Vec (n + 1) a -> Vec n a'     template: ~VAR[vec][0](1 to ~VAR[vec][0]'high)     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.last     kind: Expression-    type: Vec (n + 1) a ->-      a+    type: Vec (n + 1) a -> a     template: ~IF ~VIVADO ~THEN ~TYPMO'(fromSLV(~VAR[vec][0](~VAR[vec][0]'high)))       ~ELSE ~VAR[vec][0](~VAR[vec][0]'high) ~FI     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.init     kind: Expression-    type: Vec (n + 1) a ->-      Vec n a+    type: Vec (n + 1) a -> Vec n a     template: ~VAR[vec][0](0 to ~VAR[vec][0]'high - 1)     workInfo: Never - BlackBox:@@ -48,15 +44,13 @@ - BlackBox:     name: Clash.Sized.Vector.++     kind: Expression-    type: '(++) :: Vec n a-      -> Vec m a -> Vec (n + m) a'+    type: '(++) :: Vec n a -> Vec m a -> Vec (n + m) a'     template: ~TYPMO'(~TYPM[0]'(~ARG[0]) & ~TYPM[1]'(~ARG[1]))     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.concat     kind: Declaration-    type: 'concat :: Vec n-      (Vec m a) -> Vec (n * m) a'+    type: 'concat :: Vec n (Vec m a) -> Vec (n * m) a'     template: |-       -- concat begin       ~GENSYM[concat][0] : for ~GENSYM[i][1] in 0 to (~LENGTH[~TYP[0]] - 1) generate@@ -69,8 +63,7 @@ - BlackBox:     name: Clash.Sized.Vector.splitAt     kind: Expression-    type: 'splitAt :: SNat-      m -> Vec (m + n) a -> (Vec m a, Vec n a)'+    type: 'splitAt :: SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)'     template: ~IF~LENGTH[~TYPO]~THEN~ARG[1]~ELSE(~VAR[vec][1](0 to ~LIT[0]-1),~VAR[vec][1](~LIT[0]       to ~VAR[vec][1]'high))~FI     workInfo: Never@@ -94,8 +87,7 @@ - BlackBox:     name: Clash.Sized.Vector.map     kind: Declaration-    type: 'map :: (a -> b)-      -> Vec n a -> Vec n b'+    type: 'map :: (a -> b) -> Vec n a -> Vec n b'     template: |-       -- map begin       ~GENSYM[map][0] : for ~GENSYM[i][1] in ~RESULT'range generate~IF ~VIVADO ~THEN~IF~SIZE[~TYP[1]]~THEN@@ -120,8 +112,7 @@ - BlackBox:     name: Clash.Sized.Vector.imap     kind: Declaration-    type: 'imap :: KnownNat-      n => (Index n -> a -> b) -> Vec n a -> Vec n b'+    type: 'imap :: KnownNat n => (Index n -> a -> b) -> Vec n a -> Vec n b'     template: |-       -- imap begin       ~GENSYM[imap][0] : block@@ -157,31 +148,30 @@ - BlackBox:     name: Clash.Sized.Vector.imap_go     kind: Declaration-    type: 'imap_go :: Index-      n -> (Index n -> a -> b) -> Vec m a -> Vec m b'+    type: 'imap_go :: (Index n -> a -> b) -> Vec m a -> Index n -> Vec m b'     template: |-       -- imap_go begin-      ~GENSYM[imap][5] : for ~GENSYM[i][1] in ~RESULT'range generate~IF ~VIVADO ~THEN~IF~SIZE[~TYP[2]]~THEN-        signal ~GENSYM[map_in][2]  : ~TYPEL[~TYP[2]];~ELSE ~FI+      ~GENSYM[imap][5] : for ~GENSYM[i][1] in ~RESULT'range generate~IF ~VIVADO ~THEN~IF~SIZE[~TYP[1]]~THEN+        signal ~GENSYM[map_in][2]  : ~TYPEL[~TYP[1]];~ELSE ~FI         signal ~GENSYM[map_out][3] : ~TYPEL[~TYPO];-        signal ~GENSYM[i2][4]      : ~TYP[0];-      begin~IF~SIZE[~TYP[2]]~THEN-        ~SYM[2] <= fromSLV(~VAR[vec][2](~SYM[1]));~ELSE ~FI-        ~SYM[4] <= ~ARG[0] + to_unsigned(~SYM[1],~SIZE[~TYP[0]]);-        ~INST 1+        signal ~GENSYM[i2][4]      : ~TYP[2];+      begin~IF~SIZE[~TYP[1]]~THEN+        ~SYM[2] <= fromSLV(~VAR[vec][1](~SYM[1]));~ELSE ~FI+        ~SYM[4] <= ~ARG[2] + to_unsigned(~SYM[1],~SIZE[~TYP[2]]);+        ~INST 0           ~OUTPUT <= ~SYM[3]~ ~TYPEL[~TYPO]~-          ~INPUT  <= ~SYM[4]~ ~TYP[0]~-          ~INPUT  <= ~SYM[2]~ ~TYPEL[~TYP[2]]~+          ~INPUT  <= ~SYM[4]~ ~TYP[2]~+          ~INPUT  <= ~SYM[2]~ ~TYPEL[~TYP[1]]~         ~INST         ~RESULT(~SYM[1]) <= ~TOBV[~SYM[3]][~TYPEL[~TYPO]];       end generate;~ELSE-        signal ~SYM[4] : ~TYP[0];+        signal ~SYM[4] : ~TYP[2];       begin-        ~SYM[4] <= ~ARG[0] + to_unsigned(~SYM[1],~SIZE[~TYP[0]]);-        ~INST 1+        ~SYM[4] <= ~ARG[2] + to_unsigned(~SYM[1],~SIZE[~TYP[2]]);+        ~INST 0           ~OUTPUT <= ~RESULT(~SYM[1])~ ~TYPEL[~TYPO]~-          ~INPUT  <= ~SYM[4]~ ~TYP[0]~-          ~INPUT  <= ~VAR[vec][2](~SYM[1])~ ~TYPEL[~TYP[2]]~+          ~INPUT  <= ~SYM[4]~ ~TYP[2]~+          ~INPUT  <= ~VAR[vec][1](~SYM[1])~ ~TYPEL[~TYP[1]]~         ~INST       end generate;~FI       -- imap_go end@@ -189,8 +179,7 @@ - BlackBox:     name: Clash.Sized.Vector.zipWith     kind: Declaration-    type: 'zipWith :: (a ->-      b -> c) -> Vec n a -> Vec n b -> Vec n c'+    type: 'zipWith :: (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c'     template: |-       -- zipWith begin       ~GENSYM[zipWith][0] : for ~GENSYM[i][1] in ~RESULT'range generate~IF ~VIVADO ~THEN~IF~SIZE[~TYP[1]]~THEN@@ -219,8 +208,7 @@ - BlackBox:     name: Clash.Sized.Vector.foldr     kind: Declaration-    type: 'foldr :: (a ->-      b -> b) -> b -> Vec n a -> b'+    type: 'foldr :: (a -> b -> b) -> b -> Vec n a -> b'     template: |-       -- foldr begin~IF ~LENGTH[~TYP[2]] ~THEN       ~GENSYM[foldr][0] : block@@ -255,8 +243,7 @@ - BlackBox:     name: Clash.Sized.Vector.index_int     kind: Declaration-    type: 'index_int :: KnownNat-      n => Vec n a -> Int -> a'+    type: 'index_int :: KnownNat n => Vec n a -> Int -> a'     template: |-       -- index begin       ~IF~SIZE[~TYP[1]]~THEN~GENSYM[indexVec][0] : block@@ -275,8 +262,7 @@     name: Clash.Sized.Vector.replace_int     kind: Declaration     outputUsage: NonBlocking-    type: 'replace_int ::-      KnownNat n => Vec n a -> Int -> a -> Vec n a'+    type: 'replace_int :: KnownNat n => Vec n a -> Int -> a -> Vec n a'     template: |-       -- replace begin       ~GENSYM[replaceVec][0] : block@@ -301,23 +287,20 @@ - BlackBox:     name: Clash.Sized.Vector.length     kind: Expression-    type: 'length :: KnownNat-      n => Vec n a -> Int'+    type: 'length :: KnownNat n => Vec n a -> Int'     template: to_signed(~LIT[0],~SIZE[~TYPO])     workInfo: Constant - BlackBox:     name: Clash.Sized.Vector.replicate     kind: Expression-    type: 'replicate :: SNat-      n -> a -> Vec n a'+    type: 'replicate :: SNat n -> a -> Vec n a'     template: ~TYPMO'(0 to ~LIT[0]-1 => ~IF ~VIVADO ~THEN ~TOBV[~ARG[1]][~TYP[1]]       ~ELSE ~ARG[1] ~FI)     workInfo: Never - BlackBox:     name: Clash.Sized.Vector.transpose     kind: Declaration-    type: 'transpose :: KnownNat-      n => Vec m (Vec n a) -> Vec n (Vec m a)'+    type: 'transpose :: KnownNat n => Vec m (Vec n a) -> Vec n (Vec m a)'     template: |-       -- transpose begin       ~GENSYM[transpose_outer][2] : for ~GENSYM[row_index][3] in 0 to (~LENGTH[~TYP[1]] - 1) generate@@ -331,8 +314,7 @@ - BlackBox:     name: Clash.Sized.Vector.reverse     kind: Declaration-    type: 'reverse :: Vec-      n a -> Vec n a'+    type: 'reverse :: Vec n a -> Vec n a'     template: |-       -- reverse begin       ~GENSYM[reverse_loop][2] : for ~GENSYM[i][3] in 0 to (~LENGTH[~TYP[0]] - 1) generate@@ -371,8 +353,7 @@ - BlackBox:     name: Clash.Sized.Vector.rotateLeftS     kind: Declaration-    type: 'rotateLeftS ::-      KnownNat n => Vec n a -> SNat d -> Vec n a'+    type: 'rotateLeftS :: KnownNat n => Vec n a -> SNat d -> Vec n a'     template: |-       -- rotateLeftS begin       ~GENSYM[rotateLeftS][0] : block@@ -392,8 +373,7 @@ - BlackBox:     name: Clash.Sized.Vector.rotateRightS     kind: Declaration-    type: 'rotateRightS ::-      KnownNat n => Vec n a -> SNat d -> Vec n a'+    type: 'rotateRightS :: KnownNat n => Vec n a -> SNat d -> Vec n a'     template: |-       -- rotateRightS begin       ~GENSYM[rotateLeftS][0] : block
prims/vhdl/Clash_Xilinx_DDR.primitives.yaml view
@@ -1,12 +1,12 @@ - BlackBox:-    name: Clash.Xilinx.DDR.iddr+    name: Clash.Xilinx.DDR.iddr#     imports:     - UNISIM.vcomponents.all     kind: Declaration     libraries:     - UNISIM     type: |--      iddr+      iddr#         :: ( HasCallStack             -- ARG[0]            , KnownConfi~ fast domf    -- ARG[1]            , KnownConfi~ slow doms    -- ARG[2]@@ -19,8 +19,8 @@     template: |-       -- iddr begin       ~GENSYM[~COMPNAME_IDDR][0] : block-        signal ~GENSYM[dataout_l][1] : ~TYP[7];-        signal ~GENSYM[dataout_h][2] : ~TYP[7];+        signal ~GENSYM[data_pos][1] : ~TYP[7];+        signal ~GENSYM[data_neg][2] : ~TYP[7];         signal ~GENSYM[d][3]         : ~TYP[7];~IF ~ISACTIVEENABLE[6] ~THEN         signal ~GENSYM[ce_logic][4]: std_logic;~ELSE ~FI       begin~IF ~ISACTIVEENABLE[6] ~THEN@@ -70,8 +70,8 @@     template: |-       -- oddr begin       ~GENSYM[~COMPNAME_ODDR][0] : block-        signal ~GENSYM[dataout_l][1] : ~TYPO;-        signal ~GENSYM[dataout_h][2] : ~TYPO;+        signal ~GENSYM[data_pos][1] : ~TYPO;+        signal ~GENSYM[data_neg][2] : ~TYPO;         signal ~GENSYM[q][3]         : ~TYPO;~IF ~ISACTIVEENABLE[5] ~THEN         signal ~GENSYM[ce_logic][4]  : std_logic;~ELSE ~FI       begin~IF ~ISACTIVEENABLE[5] ~THEN@@ -79,13 +79,13 @@         ~SYM[1] <= ~ARG[6];         ~SYM[2] <= ~ARG[7]; -        ~GENSYM[gen_iddr][7] : for ~GENSYM[i][8] in ~SYM[3]'range generate+        ~GENSYM[gen_oddr][7] : for ~GENSYM[i][8] in ~SYM[3]'range generate         begin           ~GENSYM[~COMPNAME_ODDR_inst][9] : ODDR           generic map(             DDR_CLK_EDGE => "SAME_EDGE",             INIT => '0',-            SRTYPE => ~IF ~ISSYNC[2] ~THEN "SYNC" ~ELSE "ASYNC" ~FI)+            SRTYPE => ~IF ~ISSYNC[1] ~THEN "SYNC" ~ELSE "ASYNC" ~FI)           port map (             Q  => ~SYM[3](~SYM[8]),    -- 1-bit DDR output             C  => ~ARG[3],   -- 1-bit clock input
src/Clash/Backend/SystemVerilog.hs view
@@ -1,7 +1,7 @@ {-|   Copyright   :  (C) 2015-2016, University of Twente,                      2017-2018, Google Inc.,-                     2021-2023, QBayLogic B.V.,+                     2021-2024, QBayLogic B.V.,                      2022     , Google Inc.   License     :  BSD2 (see the file LICENSE)   Maintainer  :  QBayLogic B.V. <devops@qbaylogic.com>@@ -31,6 +31,8 @@ import qualified Data.HashMap.Lazy                    as HashMap import           Data.HashSet                         (HashSet) import qualified Data.HashSet                         as HashSet+import qualified Data.Map                             as Map+import           Data.Map                             (Map) import           Data.List                            (nub, nubBy) import           Data.List.Extra                      ((<:>), zipEqual) import           Data.Maybe                           (catMaybes,fromMaybe,mapMaybe)@@ -40,6 +42,7 @@ import qualified Data.Text                            as TextS import           Data.Text.Prettyprint.Doc.Extra import qualified Data.Text.Prettyprint.Doc.Extra      as PP+import           Data.Tuple                           (swap) import qualified System.FilePath  import           Clash.Annotations.Primitive          (HDL (..))@@ -59,13 +62,13 @@ import           Clash.Explicit.BlockRam.Internal     (unpackNats) import           Clash.Netlist.BlackBox.Types         (HdlSyn (..)) import           Clash.Netlist.BlackBox.Util-  (extractLiterals, renderBlackBox, renderFilePath)+  (extractLiterals, renderBlackBox, addFilePath) import qualified Clash.Netlist.Id                     as Id import           Clash.Netlist.Types                  hiding (intWidth, usages, _usages) import           Clash.Netlist.Util import           Clash.Signal.Internal                (ActiveEdge (..)) import           Clash.Util-  (SrcSpan, noSrcSpan, curLoc, makeCached, indexNote)+  (SrcSpan, clogBase, noSrcSpan, curLoc, makeCached, indexNote) import           Clash.Util.Graph                     (reverseTopSort)  -- | State for the 'Clash.Backend.SystemVerilog.SystemVerilogM' monad:@@ -82,8 +85,12 @@     , _includes  :: [(String,Doc)]     , _imports   :: [Text.Text]     , _libraries :: [Text.Text]-    , _dataFiles      :: [(String,FilePath)]-    -- ^ Files to be copied: (filename, old path)+    , _dataFiles :: Map FilePath String+    -- ^ Files to be copied: (path to file, file name). The file name stored in+    -- the map might differ from the file name in the path, to prevent name+    -- collisions.+    , _includeDirs :: [FilePath]+    -- ^ Import directories passed in with @-i@     , _memoryDataFiles:: [(String,String)]     -- ^ Files to be stored: (filename, contents). These files are generated     -- during the execution of 'genNetlist'.@@ -119,7 +126,8 @@     , _includes=[]     , _imports=[]     , _libraries=[]-    , _dataFiles=[]+    , _dataFiles=mempty+    , _includeDirs = opt_importPaths opts     , _memoryDataFiles=[]     , _tyPkgCtx=False     , _intWidth=opt_intWidth opts@@ -188,10 +196,12 @@   addImports inps = imports %= (inps ++)   addAndSetData f = do     fs <- use dataFiles-    let (fs',f') = renderFilePath fs f+    iDirs <- use includeDirs+    let (fs',f') = addFilePath iDirs fs f     dataFiles .= fs'     return f'-  getDataFiles = use dataFiles+  getDataFiles :: State SystemVerilogState [(String, FilePath)]+  getDataFiles = map swap . Map.assocs <$> use dataFiles   addMemoryDataFile f = memoryDataFiles %= (f:)   getMemoryDataFiles = use memoryDataFiles   ifThenElseExpr _ = True@@ -1228,7 +1238,9 @@ expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _)   | pNm == "Clash.Sized.Internal.Index.fromInteger#"   , [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx-  = exprLitSV (Just (Index (fromInteger n),fromInteger n)) i+  , Just k <- clogBase 2 n+  , let k' = max 1 k+  = exprLitSV (Just (Index (fromInteger n),k')) i  expr_ b (BlackBoxE _ libs imps inc bs bbCtx b') =   parenIf (b || b') (Ap (renderBlackBox libs imps inc bs bbCtx <*> pure 0))
src/Clash/Backend/VHDL.hs view
@@ -37,6 +37,8 @@ import qualified Data.HashMap.Strict                  as HashMapS import           Data.HashSet                         (HashSet) import qualified Data.HashSet                         as HashSet+import qualified Data.Map                             as Map+import           Data.Map                             (Map) import           Data.List   (mapAccumL, nub, nubBy, intersperse, group, sort) import           Data.List.Extra                      ((<:>), equalLength, zipEqual)@@ -46,6 +48,7 @@ import qualified Data.Text.Lazy                       as T import qualified Data.Text                            as TextS import           Data.Text.Extra+import           Data.Tuple                           (swap)  #if MIN_VERSION_prettyprinter(1,7,0) import qualified Prettyprinter                        as PP@@ -72,7 +75,7 @@ import           Clash.Explicit.BlockRam.Internal     (unpackNats) import           Clash.Netlist.BlackBox.Types         (HdlSyn (..)) import           Clash.Netlist.BlackBox.Util-  (extractLiterals, renderBlackBox, renderFilePath)+  (extractLiterals, renderBlackBox, addFilePath) import qualified Clash.Netlist.Id                     as Id import           Clash.Netlist.Types                  hiding (intWidth, usages, _usages) import           Clash.Netlist.Util@@ -98,8 +101,12 @@   , _libraries :: [T.Text]   , _packages  :: [T.Text]   , _includes  :: [(String,Doc)]-  , _dataFiles      :: [(String,FilePath)]-  -- ^ Files to be copied: (filename, old path)+  , _dataFiles :: Map FilePath String+  -- ^ Files to be copied: (path to file, file name). The file name stored in+  -- the map might differ from the file name in the path, to prevent name+  -- collisions.+  , _includeDirs :: [FilePath]+  -- ^ Import directories passed in with @-i@   , _memoryDataFiles:: [(String,String)]   -- ^ Files to be stored: (filename, contents). These files are generated   -- during the execution of 'genNetlist'.@@ -139,7 +146,8 @@     , _libraries=[]     , _packages=[]     , _includes=[]-    , _dataFiles=[]+    , _dataFiles=mempty+    , _includeDirs = opt_importPaths opts     , _memoryDataFiles=[]     , _idSeen=Id.emptyIdentifierSet (opt_escapedIds opts) (opt_lowerCaseBasicIds opts) VHDL     , _tyPkgCtx=False@@ -271,10 +279,11 @@   addImports imps = packages %= (imps ++)   addAndSetData f = do     fs <- use dataFiles-    let (fs',f') = renderFilePath fs f+    iDirs <- use includeDirs+    let (fs',f') = addFilePath iDirs fs f     dataFiles .= fs'     return f'-  getDataFiles = use dataFiles+  getDataFiles = map swap . Map.assocs <$> use dataFiles   addMemoryDataFile f = memoryDataFiles %= (f:)   getMemoryDataFiles = use memoryDataFiles   ifThenElseExpr _ = False@@ -1762,7 +1771,7 @@   , [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx   , Just k <- clogBase 2 n   , let k' = max 1 k-  = exprLit (Just (Unsigned k',k')) i+  = exprLit (Just (Index n,k')) i  expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _)   | pNm == "Clash.Sized.Internal.Index.maxBound#"@@ -1860,6 +1869,9 @@     | i < 0                    -> "unsigned" <> parens ("std_logic_vector" <> parens ("to_signed" <> parens(integer i <> "," <> int n)))     | i < 2^(31 :: Integer) -> "to_unsigned" <> parens (integer i <> "," <> int n)     | otherwise -> "unsigned'" <> parens lit+  Index n+   | 0 <= i && i < n -> exprLit (Just (Unsigned sz, sz)) (NumLit i)  -- reuse Unsigned implementation above+   | otherwise       -> hdlTypeErrValue hty   Signed n     | i < 2^(31 :: Integer) && i > (-2^(31 :: Integer)) -> "to_signed" <> parens (integer i <> "," <> int n)     | otherwise -> "signed'" <> parens lit
src/Clash/Backend/Verilog.hs view
@@ -45,6 +45,8 @@ import qualified Data.HashMap.Strict                  as HashMap import           Data.HashSet                         (HashSet) import qualified Data.HashSet                         as HashSet+import qualified Data.Map                             as Map+import           Data.Map                             (Map) import           Data.Maybe                           (catMaybes, fromMaybe) import           Data.Monoid                          (Ap(Ap)) import           Data.Monoid.Extra                    ()@@ -58,6 +60,7 @@ import qualified Data.Text.Lazy                       as Text import qualified Data.Text                            as TextS import           Data.Text.Prettyprint.Doc.Extra+import           Data.Tuple                           (swap) import qualified System.FilePath import           GHC.Stack                            (HasCallStack) @@ -76,13 +79,13 @@ import           Clash.Explicit.BlockRam.Internal     (unpackNats) import           Clash.Netlist.BlackBox.Types         (HdlSyn) import           Clash.Netlist.BlackBox.Util-  (extractLiterals, renderBlackBox, renderFilePath)+  (extractLiterals, renderBlackBox, addFilePath) import qualified Clash.Netlist.Id                     as Id import           Clash.Netlist.Types as N             hiding (intWidth, usages, _usages) import           Clash.Netlist.Util import           Clash.Signal.Internal                (ActiveEdge (..)) import           Clash.Util-  (SrcSpan, noSrcSpan, curLoc, indexNote, makeCached)+  (SrcSpan, clogBase, noSrcSpan, curLoc, indexNote, makeCached)  -- | State for the 'Clash.Backend.Verilog.VerilogM' monad: data VerilogState =@@ -94,8 +97,12 @@     , _includes  :: [(String,Doc)]     , _imports   :: HashSet Text.Text     , _libraries :: HashSet Text.Text-    , _dataFiles      :: [(String,FilePath)]-    -- ^ Files to be copied: (filename, old path)+    , _dataFiles :: Map FilePath String+    -- ^ Files to be copied: (path to file, file name). The file name stored in+    -- the map might differ from the file name in the path, to prevent name+    -- collisions.+    , _includeDirs :: [FilePath]+    -- ^ Import directories passed in with @-i@     , _memoryDataFiles:: [(String,String)]     -- ^ Files to be stored: (filename, contents). These files are generated     -- during the execution of 'genNetlist'.@@ -126,7 +133,8 @@     , _includes=[]     , _imports=HashSet.empty     , _libraries=HashSet.empty-    , _dataFiles=[]+    , _dataFiles=mempty+    , _includeDirs = opt_importPaths opts     , _memoryDataFiles=[]     , _customConstrs=HashMap.empty     , _intWidth=opt_intWidth opts@@ -191,10 +199,11 @@   addImports inps = imports %= (\s -> foldl' (flip HashSet.insert) s inps)   addAndSetData f = do     fs <- use dataFiles-    let (fs',f') = renderFilePath fs f+    iDirs <- use includeDirs+    let (fs',f') = addFilePath iDirs fs f     dataFiles .= fs'     return f'-  getDataFiles = use dataFiles+  getDataFiles = map swap . Map.assocs <$> use dataFiles   addMemoryDataFile f = memoryDataFiles %= (f:)   getMemoryDataFiles = use memoryDataFiles   ifThenElseExpr _ = True@@ -1151,7 +1160,9 @@ expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _)   | pNm == "Clash.Sized.Internal.Index.fromInteger#"   , [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx-  = exprLit undefValue (Just (Index (fromInteger n),fromInteger n)) i+  , Just k <- clogBase 2 n+  , let k' = max 1 k+  = exprLitV (Just (Index (fromInteger n),k')) i  expr_ b (BlackBoxE _ libs imps inc bs bbCtx b') = do   parenIf (b || b') (Ap (renderBlackBox libs imps inc bs bbCtx <*> pure 0))@@ -1216,14 +1227,16 @@ exprLitV :: Maybe (HWType,Size) -> Literal -> VerilogM Doc exprLitV = exprLit undefValue -exprLit :: Lens' s (Maybe (Maybe Int)) -> Maybe (HWType,Size) -> Literal -> Ap (State s) Doc+exprLit :: Backend s => Lens' s (Maybe (Maybe Int)) -> Maybe (HWType,Size) -> Literal -> Ap (State s) Doc exprLit _ Nothing (NumLit i) = integer i  exprLit k (Just (hty,sz)) (NumLit i0) = case hty of   Unsigned _    | i < 0     -> string "-" <> int sz <> string "'d" <> integer (abs i)    | otherwise -> int sz <> string "'d" <> integer i-  Index _ -> int (typeSize hty) <> string "'d" <> integer i+  Index n+   | 0 <= i0 && i0 < n -> int (typeSize hty) <> string "'d" <> integer i0+   | otherwise         -> hdlTypeErrValue hty   Signed _    | i < 0     -> string "-" <> int sz <> string "'sd" <> integer (abs i)    | otherwise -> int sz <> string "'sd" <> integer i
src/Clash/Core/FreeVars.hs view
@@ -29,11 +29,15 @@   ) where +#if MIN_VERSION_ghc(9,8,4) || (MIN_VERSION_ghc(9,6,7) && !MIN_VERSION_ghc(9,8,0))+#define UNIQUE_IS_WORD64+#endif+ import qualified Control.Lens           as Lens import Control.Lens.Fold                (Fold) import Control.Lens.Getter              (Contravariant) import Data.Coerce-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64 import qualified GHC.Data.Word64Set     as IntSet #else import qualified Data.IntSet            as IntSet@@ -86,7 +90,7 @@   :: (Contravariant f, Applicative f)   => (forall b . Var b -> Bool)   -- ^ Predicate telling whether a variable is interesting-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64   -> IntSet.Word64Set #else   -> IntSet.IntSet
src/Clash/Core/TermLiteral.hs view
@@ -48,7 +48,7 @@ import           Clash.Core.Literal import           Clash.Core.Name                 (Name(..)) import           Clash.Core.Pretty               (showPpr)-import           Clash.Core.Term                 (Term(Literal, Data), collectArgs)+import           Clash.Core.Term                 (Term(Literal, Data, Tick), collectArgs) import           Clash.Promoted.Nat import           Clash.Promoted.Nat.Unsafe import           Clash.Sized.Index               (Index)@@ -127,6 +127,7 @@   termToData t = Left t  instance TermLiteral Integer where+  termToData (Tick _ e) = termToData e   termToData (Literal (IntegerLiteral n)) = Right n   termToData (collectArgs -> (_, [Left (Literal (IntegerLiteral n))])) = Right n   termToData t = Left t@@ -136,6 +137,7 @@   termToData t = Left t  instance TermLiteral Natural where+  termToData (Tick _ e) = termToData e   termToData t@(Literal (NaturalLiteral n))     | n < 0 = Left t     | otherwise = Right (fromIntegral n)@@ -151,6 +153,7 @@ -- instance TermLiteral (SNat n) where   termToData = \case+    Tick _ e                   -> termToData e     Literal (NaturalLiteral n) -> Right (unsafeSNat n)     t                          -> Left t 
src/Clash/Core/VarEnv.hs view
@@ -97,13 +97,17 @@   ) where +#if MIN_VERSION_ghc(9,8,4) || (MIN_VERSION_ghc(9,6,7) && !MIN_VERSION_ghc(9,8,0))+#define UNIQUE_IS_WORD64+#endif+ import           Control.DeepSeq           (NFData) import           Data.Binary               (Binary) import           Data.Coerce               (coerce) import qualified Data.List                 as List import qualified Data.List.Extra           as List import           Data.Maybe                (fromMaybe)-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64 import           Data.Word                 (Word64) #endif @@ -389,7 +393,7 @@ -- * InScopeSet  type Seed-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64   = Word64 #else   = Int
src/Clash/Data/UniqMap.hs view
@@ -39,13 +39,17 @@   , elems   ) where +#if MIN_VERSION_ghc(9,8,4) || (MIN_VERSION_ghc(9,6,7) && !MIN_VERSION_ghc(9,8,0))+#define UNIQUE_IS_WORD64+#endif+ import           Prelude hiding (elem, filter, lookup, notElem, null)  import           Control.DeepSeq (NFData) import           Data.Binary (Binary (..)) import           Data.Bifunctor (first) import           Data.Function (on)-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64 import           GHC.Data.Word64Map.Strict (Word64Map) import qualified GHC.Data.Word64Map.Strict as IntMap #else@@ -71,7 +75,7 @@ -- uniqueable and provide their own key, however a unique can be associated -- with any value. newtype UniqMap a-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64   = UniqMap { uniqMapToIntMap :: Word64Map a } #else   = UniqMap { uniqMapToIntMap :: IntMap a }@@ -85,7 +89,7 @@     , Semigroup     , Show     )-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64 instance Binary a => Binary (UniqMap a) where   put (UniqMap m) = put (IntMap.size m) <> mapM_ put (IntMap.toAscList m)   get             = fmap (UniqMap . IntMap.fromDistinctAscList) get
src/Clash/Driver.hs view
@@ -27,7 +27,7 @@ import           Control.DeepSeq import           Control.Exception                (throw, Exception) import qualified Control.Monad                    as Monad-import           Control.Monad                    (unless, foldM, forM, filterM)+import           Control.Monad                    (unless, foldM, forM) import           Control.Monad.Catch              (MonadMask, MonadThrow (throwM)) import           Control.Monad.Extra              (whenM, ifM, unlessM) import           Control.Monad.IO.Class           (MonadIO)@@ -476,7 +476,7 @@       -- TODO: Data files should go into their own directory       -- FIXME: Files can silently overwrite each other       hdlDocDigests <- mapM (writeHDL hdlDir) hdlDocs-      dataFilesDigests <- copyDataFiles (opt_importPaths opts) hdlDir dfiles+      dataFilesDigests <- copyDataFiles hdlDir dfiles       memoryFilesDigests <- writeMemoryDataFiles hdlDir mfiles        let@@ -1020,17 +1020,16 @@   forM files $ \(fname, content) ->     writeAndHash (dir </> fname) (ByteStringLazyChar8.pack content) --- | Copy data files added with ~FILE+-- | Copy data files added with ~FILE, assumes the files are canonicalized already.+-- Throws an error on relative paths as sanity check. copyDataFiles-  :: [FilePath]-  -- ^ Import directories passed in with @-i@-  -> FilePath+  :: FilePath   -- ^ Directory to copy to   -> [(FilePath,FilePath)]   -- ^ [(name of newly made file in HDL output dir, file to copy)]   -> IO [ByteString]   -- ^ SHA256 hashes of written files-copyDataFiles idirs targetDir = mapM copyDataFile+copyDataFiles targetDir = mapM copyDataFile  where   copyDataFile :: (FilePath, FilePath) -> IO ByteString   copyDataFile (newName, toCopy)@@ -1039,28 +1038,7 @@         (doesFileExist toCopy)         (copyAndHash toCopy (targetDir </> newName))         (error [I.i|Could not find data file #{show toCopy}. Does it exist?|])-    | otherwise = do-      let candidates = map (</> toCopy) idirs-      found <- filterM doesFileExist candidates-      case found of-        [] -> error [I.i|-          Could not find data file #{show toCopy}. The following directories were-          searched:--            #{idirs}--          You can add directories Clash will look in using `-i`.-        |]-        (_:_:_) -> error [I.i|-          Multiple data files for #{show toCopy} found. The following candidates-          were found:--            #{found}--          Please disambiguate data files.-        |]-        [c] ->-          copyAndHash c (targetDir </> newName)+    | otherwise = error [I.i|copyDataFiles received a relative path #{show toCopy}. This is a bug in Clash, please report it.|]    copyAndHash src dst = do     ifM
src/Clash/Netlist/BlackBox.hs view
@@ -20,7 +20,13 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-} -module Clash.Netlist.BlackBox where+module Clash.Netlist.BlackBox+    ( mkBlackBoxContext+    , extractPrimWarnOrFail+    , mkPrimitive+    , prepareBlackBox+    , isLiteral+    ) where  import           Control.Exception             (throw) import           Control.Lens                  ((%=))
src/Clash/Netlist/BlackBox/Parser.hs view
@@ -150,8 +150,8 @@  -- | Parse SigD pSigD :: Parser [Element]-pSigD = some (pTagE <|> (Text (pack "[") <$ (pack <$> string "[\\"))-                    <|> (Text (pack "]") <$ (pack <$> string "\\]"))+pSigD = some (pTagE <|> (EscapedSymbol SquareBracketOpen <$ string "[\\")+                    <|> (EscapedSymbol SquareBracketClose <$ string "\\]")                     <|> (Text <$> (pack <$> some (satisfyRange '\000' '\90')))                     <|> (Text <$> (pack <$> some (satisfyRange '\94' '\125')))) 
src/Clash/Netlist/BlackBox/Types.hs view
@@ -19,6 +19,7 @@  , BlackBoxTemplate  , TemplateKind (..)  , Element(..)+ , EscapedSymbol(..)  , Decl(..)  , HdlSyn(..)  , RenderVoid(..)@@ -211,6 +212,12 @@   | CtxName   -- ^ The "context name", name set by `Clash.Magic.setName`, defaults to the   -- name of the closest binder+  | EscapedSymbol EscapedSymbol+  -- ^ Used for "[\" and "\]", they'll be rendered as "[" and "]",+  -- but pretty printed as "[\" and "\]".+  deriving (Show, Generic, NFData, Binary, Eq, Hashable)++data EscapedSymbol = SquareBracketOpen | SquareBracketClose   deriving (Show, Generic, NFData, Binary, Eq, Hashable)  -- | Component instantiation hole. First argument indicates which function argument
src/Clash/Netlist/BlackBox/Util.hs view
@@ -20,12 +20,28 @@ {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TemplateHaskell #-} -module Clash.Netlist.BlackBox.Util where+module Clash.Netlist.BlackBox.Util+    ( renderTemplate+    , walkElement+    , verifyBlackBoxContext+    , onBlackBox+    , setSym+    , extractLiterals+    , renderBlackBox+    , getUsedArguments+    , canonicalizeDataFilePath+    , addFilePath+    , exprToString+    , renderElem+    , getDomainConf+    , prettyBlackBox+    ) where  import           Control.Exception               (throw) import           Control.Lens   (use, (%=), _1, _2, element, (^?))-import           Control.Monad                   (forM, (<=<))+import           Control.Monad                   (forM, (<=<), filterM)+import           Control.Monad.Extra             (ifM) import           Control.Monad.State             (State, StateT (..), lift, gets) import           Data.Bitraversable              (bitraverse) import           Data.Bool                       (bool)@@ -36,11 +52,17 @@ import qualified Data.IntMap                     as IntMap import           Data.List                       (nub) import           Data.List.Extra                 (indexMaybe)+import qualified Data.Map                        as Map+import           Data.Map                        (Map) import           Data.Maybe                      (mapMaybe, maybeToList, fromJust) import           Data.Monoid                     (Ap(getAp))+import qualified Data.Set                        as Set+import           Data.Set                        (Set) import qualified Data.Text import           Data.Text.Lazy                  (Text) import qualified Data.Text.Lazy                  as Text+import           System.Directory                (doesFileExist, canonicalizePath)+import           System.IO.Unsafe                (unsafePerformIO)  #if MIN_VERSION_prettyprinter(1,7,0) import qualified Prettyprinter                   as PP@@ -51,7 +73,7 @@ import           Data.Text.Prettyprint.Doc.Extra import           GHC.Stack                       (HasCallStack) import           System.FilePath                 (replaceBaseName, takeBaseName,-                                                  takeFileName, (<.>))+                                                  takeFileName, (<.>), isAbsolute, (</>)) import           Text.Printf import           Text.Read                       (readEither) import           Text.Trifecta.Result            hiding (Err)@@ -126,6 +148,7 @@   DevNull _        -> Nothing   SigD _ nM        -> nM   CtxName          -> Nothing+  EscapedSymbol _  -> Nothing  -- | Determine if the number of normal\/literal\/function inputs of a blackbox -- context at least matches the number of argument that is expected by the@@ -292,23 +315,85 @@                   ++ "blackbox for " ++ bbnm         ) -selectNewName-    :: Foldable t-    => t String-    -- ^ Set of existing names-    -> FilePath-    -- ^ Name for new file (-    -> String+type FileName = FilePath++-- | Canonicalizes a datafile path, keeping in mind that the path might be+-- relative to one of the import directories passed in with @-i@.+canonicalizeDataFilePath ::+  -- | Import directories passed in with @-i@+  [FilePath] ->+  -- | File to canonicalize+  FilePath ->+  FilePath+canonicalizeDataFilePath idirs toCanonicalize+  | isAbsolute toCanonicalize = unsafePerformIO $+    ifM+      (doesFileExist toCanonicalize)+      (canonicalizePath toCanonicalize)+      (error [I.i|Could not find data file #{show toCanonicalize}. Does it exist?|])+  | otherwise = unsafePerformIO $ do+      let candidates = map (</> toCanonicalize) idirs+      found <- filterM doesFileExist candidates+      case found of+        [] -> error [I.i|+          Could not find data file #{show toCanonicalize}. The following directories were+          searched:+            #{idirs}+        |]+        (_:_:_) -> error [I.i|+          Multiple data files for #{show toCanonicalize} found. The following candidates+          were found:+            #{found}+          Please disambiguate data files.+        |]+        [c] ->+          canonicalizePath c+{-# NOINLINE canonicalizeDataFilePath #-} -- To contain unsafePerformIO++-- | Select a new file name that doesn't collide with existing names. Might return+-- the same name as given if there are no collisions.+selectNewName ::+  -- | Set of existing names+  Set FileName ->+  -- | Name for file+  FileName ->+  -- | Updated file name+  FileName selectNewName as a-  | elem a as = selectNewName as (replaceBaseName a (takeBaseName a ++ "_"))+  | a `Set.member` as = selectNewName as (replaceBaseName a (takeBaseName a ++ "_"))   | otherwise = a -renderFilePath :: [(String,FilePath)] -> String -> ([(String,FilePath)],String)-renderFilePath fs f = ((f'',f):fs, f'')-  where-    f'  = takeFileName f-    f'' = selectNewName (map fst fs) f'+-- | Add a data file to a collection of existing files. Typically used in the HDL+-- backend's 'addAndSetData'.+addFilePath ::+  -- | Import directories passed in with @-i@+  [FilePath] ->+  -- | Map of existing file paths to file names. The file names are guaranteed+  -- to be unique, as long as this function is used to add new file paths.+  Map FilePath FileName ->+  -- | New file path to add. The canonicalized version of this file path is stored+  -- in the map. See 'canonicalizeFilePath'.+  FilePath ->+  -- | Updated map and filename. Note that the returned filename might be different+  -- from the filename in the given filepath in case of naming collisions.+  (Map FilePath FileName, FileName)+addFilePath iDirs existing path =+  case Map.lookup canonicalizedPath existing of+    Just existingName ->+      -- This path was already added, return existing map and name+      (existing, existingName)+    Nothing ->+      -- Select a new name that doesn't collide with existing names+      ( Map.insert canonicalizedPath newFileName existing+      , newFileName+      )+ where+  canonicalizedPath = canonicalizeDataFilePath iDirs path +  allNames = Set.fromList (Map.elems existing)+  fileName = takeFileName canonicalizedPath+  newFileName = selectNewName allNames fileName+ -- | Render a blackbox given a certain context. Returns a filled out template -- and a list of 'hidden' inputs that must be added to the encompassing component. renderTemplate@@ -403,7 +488,7 @@     Just (templ0,_,libs,imps,inc,pCtx) -> do       let b' = pCtx { bbResults = [(o,oTy)], bbInputs = bbInputs pCtx ++ is }           layoutOptions = LayoutOptions (AvailablePerLine 120 0.4)-          render = N.BBTemplate . parseFail . renderLazy . layoutPretty layoutOptions+          render = N.BBTemplate . parseFail b' . renderLazy . layoutPretty layoutOptions        templ1 <-         case templ0 of@@ -660,10 +745,15 @@       Nothing -> error $ "Can't find domain " <> show dom <> ". Please report an issue at https://github.com/clash-lang/clash-compiler/issues."       Just conf -> pure conf -parseFail :: Text -> BlackBoxTemplate-parseFail t = case runParse t of+parseFail :: BlackBoxContext -> Text -> BlackBoxTemplate+parseFail b t = case runParse t of   Failure errInfo ->-    error (show (_errDoc errInfo))+    error $ unlines+        [ "error while parsing blackbox: " <> Data.Text.unpack (bbName b)+        , "in component " <> Data.Text.unpack (Id.toText $ bbCompName b)+        , "error:"+        , show (_errDoc errInfo)+        ]   Success templ -> templ  idToExpr@@ -904,6 +994,9 @@     -> return (Id.toLazyText t)   _ -> error "internal error" +renderTag _ (EscapedSymbol sym) = case sym of+  SquareBracketOpen  -> return "["+  SquareBracketClose -> return "]"  renderTag _ e = do e' <- getAp (prettyElem e)                    error $ $(curLoc) ++ "Unable to evaluate: " ++ show e'@@ -1108,6 +1201,9 @@                                   <> brackets (string $ Text.concat bbname')                                   <> brackets (string $ Text.concat source')) prettyElem CtxName = return "~CTXNAME"+prettyElem (EscapedSymbol sym) = case sym of+  SquareBracketOpen  -> return "[\\"+  SquareBracketClose -> return "\\]"  -- | Recursively walk @Element@, applying @f@ to each element in the tree. walkElement@@ -1178,6 +1274,7 @@         Repeat es1 es2 ->           concatMap go es1 ++ concatMap go es2         CtxName -> []+        EscapedSymbol _ -> []  -- | Determine variables used in an expression. Used for VHDL sensitivity list. -- Also see: https://github.com/clash-lang/clash-compiler/issues/365@@ -1266,6 +1363,7 @@         TypM _ -> Nothing         Vars _ -> Nothing         CtxName -> Nothing+        EscapedSymbol _ -> Nothing  onBlackBox   :: (BlackBoxTemplate -> r)
src/Clash/Normalize/Transformations/Specialize.hs view
@@ -463,11 +463,19 @@                       -- binding @g'@ where both the body of @mealy@ and @g@                       -- are inlined, meaning the state-transition-function                       -- and the memory element will be in a single function.+                      --+                      -- Finally, we must make sure we do not inline the bodies+                      -- of functions with a Synthesize annotation, as that would+                      -- duplicate Clash compiler work. See also issue #3024                       gTmM <- fmap (UniqMap.lookup g) $ Lens.use bindings+                      let gBody = if g `elemVarSet` topEnts then+                                    Nothing+                                  else+                                    fmap bindingTerm gTmM                       return                         ( g                         , preferNoInline inl (maybe noUserInline bindingSpec gTmM)-                        , maybe specArg (Left . (`mkApps` gArgs) . bindingTerm) gTmM+                        , maybe specArg (Left . (`mkApps` gArgs)) gBody                         )                     else return (f,inl,specArg)                 _ -> return (f,inl,specArg)
src/Clash/Primitives/Util.hs view
@@ -165,6 +165,7 @@   -- ^ unresolved primitives found in annotations (in LoadModules and   -- LoadInterfaceFiles)   -> [(TS.Text, PrimitiveGuard ())]+  -- ^ Primitive guards found in annotations   -> [FilePath]   -- ^ Directories to search for primitive definitions   -> IO ResolvedPrimMap
src/Clash/Unique.hs view
@@ -17,8 +17,13 @@   , fromGhcUnique   ) where +#if MIN_VERSION_ghc(9,8,4) || (MIN_VERSION_ghc(9,6,7) && !MIN_VERSION_ghc(9,8,0))+#define UNIQUE_IS_WORD64+#endif+ import Data.Word (Word64)-#if MIN_VERSION_ghc(9,8,4)++#ifdef UNIQUE_IS_WORD64 import GHC.Word (Word64(W64#)) import GHC.Exts (Word64#) #else@@ -31,7 +36,7 @@ import qualified Unique as GHC #endif -#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64 type Unique = Word64 type Unique# = Word64# @@ -63,7 +68,7 @@   getUnique = id   setUnique = flip const -#if !MIN_VERSION_ghc(9,8,4)+#ifndef UNIQUE_IS_WORD64 instance Uniquable Word64 where   getUnique = fromIntegral   setUnique _ = fromIntegral
src/Clash/Util.hs view
@@ -1,7 +1,7 @@ {-|   Copyright   :  (C) 2012-2016, University of Twente   License     :  BSD2 (see the file LICENSE)-  Maintainer  :  Christiaan Baaij <christiaan.baaij@gmail.com>+  Maintainer  :  QBayLogic B.V. <devops@qbaylogic.com>    Assortment of utility function used in the Clash library -}@@ -87,6 +87,10 @@   show (ClashException _ s eM) = s ++ "\n" ++ maybe "" id eM  instance Exception.Exception ClashException++-- | Construct a string pattern match out of the given @TemplateHaskell@ name+namePat :: TH.Name -> TH.Q TH.Pat+namePat = return . TH.LitP . TH.StringL . show  assertPanic   :: String -> Int -> a
src/Clash/Util/Graph.hs view
@@ -14,9 +14,13 @@   , callGraphBindings   ) where +#if MIN_VERSION_ghc(9,8,4) || (MIN_VERSION_ghc(9,6,7) && !MIN_VERSION_ghc(9,8,0))+#define UNIQUE_IS_WORD64+#endif+ import           Data.Tuple            (swap) import           Data.Foldable         (foldlM)-#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64 import qualified GHC.Data.Word64Map.Strict as IntMap import qualified GHC.Data.Word64Set        as IntSet #else@@ -33,7 +37,7 @@ import           Clash.Normalize.Util (callGraph) import           Clash.Unique (Unique) -#if MIN_VERSION_ghc(9,8,4)+#ifdef UNIQUE_IS_WORD64 type IntMap = IntMap.Word64Map type IntSet = IntSet.Word64Set #endif
src/Data/Text/Prettyprint/Doc/Extra.hs view
@@ -15,8 +15,8 @@  import           Control.Applicative import           Data.String                           (IsString (..))-import           Data.Text                             as T-import           Data.Text.Lazy                        as LT+import qualified Data.Text                             as T+import qualified Data.Text.Lazy                        as LT  #if MIN_VERSION_prettyprinter(1,7,0) import qualified Prettyprinter                         as PP