clash-ghc 0.3.3 → 0.4
raw patch · 55 files changed
+2256/−1693 lines, 55 filesdep ~clash-libdep ~clash-prelude
Dependency ranges changed: clash-lib, clash-prelude
Files
- CHANGELOG.md +7/−0
- clash-ghc.cabal +27/−25
- primitives/CLaSH.GHC.GHC2Core.json +16/−0
- primitives/CLaSH.Prelude.BlockRam.json +34/−0
- primitives/CLaSH.Prelude.Testbench.json +24/−0
- primitives/CLaSH.Promoted.Nat.json +11/−0
- primitives/CLaSH.Promoted.Symbol.json +11/−0
- primitives/CLaSH.Signal.Bundle.json +6/−0
- primitives/CLaSH.Signal.Explicit.json +6/−0
- primitives/CLaSH.Signal.Internal.json +86/−0
- primitives/CLaSH.Sized.Internal.BitVector.json +432/−0
- primitives/CLaSH.Sized.Internal.Index.json +76/−0
- primitives/CLaSH.Sized.Internal.Signed.json +186/−0
- primitives/CLaSH.Sized.Internal.Unsigned.json +163/−0
- primitives/CLaSH.Sized.Vector.json +365/−0
- primitives/Control.Exception.Base.json +21/−0
- primitives/GHC.Base.json +33/−0
- primitives/GHC.CString.json +11/−0
- primitives/GHC.Classes.json +63/−0
- primitives/GHC.Err.json +11/−0
- primitives/GHC.Integer.Type.json +133/−0
- primitives/GHC.Prim.json +76/−0
- primitives/GHC.Real.json +16/−0
- primitives/GHC.Typelits.json +6/−0
- primitives/GHC.Types.json +11/−0
- primitives/Unsafe.Coerce.json +6/−0
- primitives/clash.bit.json +0/−26
- primitives/clash.ghc.ghc2core.json +0/−16
- primitives/clash.prelude.explicit.json +0/−51
- primitives/clash.prelude.json +0/−50
- primitives/clash.promoted.nat.json +0/−11
- primitives/clash.signal.explicit.json +0/−38
- primitives/clash.signal.implicit.json +0/−33
- primitives/clash.signal.types.json +0/−16
- primitives/clash.sized.signed.json +0/−227
- primitives/clash.sized.unsigned.json +0/−196
- primitives/clash.sized.vector.json +0/−437
- primitives/control.exception.base.json +0/−16
- primitives/ghc.base.json +0/−33
- primitives/ghc.classes.json +0/−63
- primitives/ghc.cstring.json +0/−11
- primitives/ghc.err.json +0/−11
- primitives/ghc.integer.type.json +0/−123
- primitives/ghc.prim.json +0/−76
- primitives/ghc.real.json +0/−16
- primitives/ghc.typelits.json +0/−6
- primitives/ghc.types.json +0/−11
- primitives/unsafe.coerce.json +0/−6
- src-bin/InteractiveUI.hs +13/−18
- src-bin/Main.hs +12/−6
- src-ghc/CLaSH/GHC/Evaluator.hs +106/−7
- src-ghc/CLaSH/GHC/GHC2Core.hs +209/−78
- src-ghc/CLaSH/GHC/GenerateBindings.hs +4/−2
- src-ghc/CLaSH/GHC/LoadModules.hs +42/−37
- src-ghc/CLaSH/GHC/NetlistTypes.hs +33/−47
CHANGELOG.md view
@@ -1,5 +1,12 @@ # Changelog for the [`clash-ghc`](http://hackage.haskell.org/package/clash-ghc) package +## 0.4 *November 17th 2014*+* New features:+ * Support for clash-prelude 0.6++* Fixes bugs:+ * clash-ghc ignores "-package-db" flag [#35](https://github.com/christiaanb/clash2/issues/35)+ ## 0.3.3 *August 12th 2014* * Fixes bugs: * Compile with GHC 7.8.3 [#31](https://github.com/christiaanb/clash2/issues/31)
clash-ghc.cabal view
@@ -1,5 +1,5 @@ Name: clash-ghc-Version: 0.3.3+Version: 0.4 Synopsis: CAES Language for Synchronous Hardware Description: CλaSH (pronounced ‘clash’) is a functional hardware description language that@@ -31,28 +31,30 @@ src-bin/HsVersions.h, src-bin/PosixSource.h -Data-files: primitives/clash.bit.json,- primitives/clash.ghc.ghc2core.json,- primitives/clash.prelude.json,- primitives/clash.prelude.explicit.json,- primitives/clash.promoted.nat.json,- primitives/clash.signal.explicit.json,- primitives/clash.signal.implicit.json,- primitives/clash.signal.types.json,- primitives/clash.sized.signed.json,- primitives/clash.sized.unsigned.json,- primitives/clash.sized.vector.json,- primitives/control.exception.base.json,- primitives/ghc.base.json,- primitives/ghc.classes.json,- primitives/ghc.cstring.json,- primitives/ghc.err.json,- primitives/ghc.integer.type.json,- primitives/ghc.prim.json,- primitives/ghc.real.json,- primitives/ghc.typelits.json,- primitives/ghc.types.json,- primitives/unsafe.coerce.json+Data-files: primitives/CLaSH.GHC.GHC2Core.json,+ primitives/CLaSH.Prelude.BlockRam.json,+ primitives/CLaSH.Prelude.Testbench.json,+ primitives/CLaSH.Promoted.Nat.json,+ primitives/CLaSH.Promoted.Symbol.json,+ primitives/CLaSH.Signal.Bundle.json,+ primitives/CLaSH.Signal.Explicit.json,+ primitives/CLaSH.Signal.Internal.json,+ primitives/CLaSH.Sized.Internal.BitVector.json,+ primitives/CLaSH.Sized.Internal.Index.json,+ primitives/CLaSH.Sized.Internal.Signed.json,+ primitives/CLaSH.Sized.Internal.Unsigned.json,+ primitives/CLaSH.Sized.Vector.json,+ primitives/Control.Exception.Base.json,+ primitives/GHC.Base.json,+ primitives/GHC.Classes.json,+ primitives/GHC.CString.json,+ primitives/GHC.Err.json,+ primitives/GHC.Integer.Type.json,+ primitives/GHC.Prim.json,+ primitives/GHC.Real.json,+ primitives/GHC.Typelits.json,+ primitives/GHC.Types.json,+ primitives/Unsafe.Coerce.json Cabal-version: >=1.10 @@ -83,8 +85,8 @@ base >= 4.3.1.0 && < 5, bifunctors >= 4.1.1, bytestring >= 0.9,- clash-lib >= 0.3.2,- clash-prelude >= 0.5.1,+ clash-lib >= 0.4,+ clash-prelude >= 0.6, containers >= 0.5.4.0, directory >= 1.2, filepath >= 1.3,
+ primitives/CLaSH.GHC.GHC2Core.json view
@@ -0,0 +1,16 @@+[ { "BlackBox" :+ { "name" : "EmptyCase"+ , "templateE" : "~ERRORO"+ }+ }+, { "Primitive" :+ { "name" : "_CO_"+ , "primType" : "Constructor"+ }+ }+, { "Primitive" :+ { "name" : "_TY_"+ , "primType" : "Constructor"+ }+ }+]
+ primitives/CLaSH.Prelude.BlockRam.json view
@@ -0,0 +1,34 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Prelude.BlockRam.cblockRam"+ , "comment" :+ "cblockRam :: (KnownNat n, KnownNat m) -- (ARG[0],ARG[1])+ => SClock clk -- clk, ARG[2]+ -> Vec n a -- init, ARG[3]+ -> CSignal clk (Unsigned m) -- wr, ARG[4]+ -> CSignal clk (Unsigned m) -- rd, ARG[5]+ -> CSignal clk Bool -- wren, ARG[6]+ -> CSignal clk a -- din, ARG[7]+ -> CSignal clk a"+ , "templateD" :+"blockram_~SYM[0] : block+ signal ~SYM[1] : ~TYP[3] := ~LIT[3]; -- ram+ signal ~SYM[2] : ~TYP[7]; -- inp+ signal ~SYM[3] : ~TYP[7]; -- outp+begin+ ~SYM[2] <= ~ARG[7];++ process(~CLK[2])+ begin+ if rising_edge(~CLK[2]) then+ if ~ARG[6] then+ ~SYM[1](to_integer(~ARG[4])) <= ~SYM[2];+ end if;+ ~SYM[3] <= ~SYM[1](to_integer(~ARG[5]));+ end if;+ end process;++ ~RESULT <= ~SYM[3];+end block;"+ }+ }+]
+ primitives/CLaSH.Prelude.Testbench.json view
@@ -0,0 +1,24 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Prelude.Testbench.csassert"+ , "comment" :+ "csassert :: (Eq a,Show a) -- (ARG[0],ARG[1])+ => CSignal t a -- ^ Checked value (ARG[2])+ -> CSignal t a -- ^ Expected value (ARG[3])+ -> CSignal t b -- ^ Return valued (ARG[4])+ -> CSignal t b"+ , "templateD" :+"assert_~SYM[0] : block+begin+ -- pragma translate_off+ process(~CLK[2],~RST[2],~ARG[2],~ARG[3]) is+ begin+ if (rising_edge(~CLK[2]) or rising_edge(~RST[2])) then+ assert (~ARG[2] = ~ARG[3]) report (\"expected: \" & to_string (~ARG[3]) & \", actual: \" & to_string (~ARG[2])) severity error;+ end if;+ end process;+ -- pragma translate_on+ ~RESULT <= ~ARG[4];+end block;"+ }+ }+]
+ primitives/CLaSH.Promoted.Nat.json view
@@ -0,0 +1,11 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Promoted.Nat.SNat"+ , "templateE" : "~LIT[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Promoted.Nat.snatToInteger"+ , "templateE" : "~LIT[0]"+ }+ }+]
+ primitives/CLaSH.Promoted.Symbol.json view
@@ -0,0 +1,11 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Promoted.Symbol.SSymbol"+ , "templateE" : "~LIT[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Promoted.Symbol.symbolToString"+ , "templateE" : "~LIT[0]"+ }+ }+]
+ primitives/CLaSH.Signal.Bundle.json view
@@ -0,0 +1,6 @@+[ { "Primitive" :+ { "name" : "CLaSH.Signal.Bundle.vecBundle#"+ , "primType" : "Function"+ }+ }+]
+ primitives/CLaSH.Signal.Explicit.json view
@@ -0,0 +1,6 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Signal.Explicit.veryUnsafeSynchronizer"+ , "templateE" : "~ARG[2]"+ }+ }+]
+ primitives/CLaSH.Signal.Internal.json view
@@ -0,0 +1,86 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Signal.Internal.register#"+ , "comment" :+ "register# :: SClock clk -- ARG[0]+ -> a -- ARG[1]+ -> CSignal clk a -- ARG[2]+ -> CSignal clk a"+ , "templateD" :+"register_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+begin+ ~SYM[1] <= ~ARG[1];++ process(~CLK[0],~RST[0],~SYM[1])+ begin+ if ~RST[0] = '0' then+ ~SYM[2] <= ~SYM[1];+ elsif rising_edge(~CLK[0]) then+ ~SYM[2] <= ~ARG[2];+ end if;+ end process;++ ~RESULT <= ~SYM[2];+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Signal.Internal.regEn#"+ , "comment" :+ "regEn# :: SClock clk -- ARG[0]+ -> a -- ARG[1]+ -> CSignal clk Bool -- ARG[2]+ -> CSignal clk a -- ARG[3]+ -> CSignal clk a"+ , "templateD" :+"regEn_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+ signal ~SYM[3] : ~TYP[3];+begin+ ~SYM[1] <= ~ARG[1];+ ~SYM[2] <= ~ARG[2];++ process(~CLK[0],~RST[0],~SYM[1],~SYM[2])+ begin+ if ~RST[0] = '0' then+ ~SYM[3] <= ~SYM[1];+ elsif rising_edge(~CLK[0]) then+ if ~SYM[2] then+ ~SYM[3] <= ~ARG[3];+ end if;+ end if;+ end process;++ ~RESULT <= ~SYM[3];+end block;"+ }+ }++, { "Primitive" :+ { "name" : "CLaSH.Signal.Internal.signal#"+ , "primType" : "Function"+ }+ }+, { "Primitive" :+ { "name" : "CLaSH.Signal.Internal.mapSignal#"+ , "primType" : "Function"+ }+ }+, { "Primitive" :+ { "name" : "CLaSH.Signal.Internal.appSignal#"+ , "primType" : "Function"+ }+ }+, { "Primitive" :+ { "name" : "CLaSH.Signal.Internal.foldr#"+ , "primType" : "Function"+ }+ }+, { "Primitive" :+ { "name" : "CLaSH.Signal.Internal.traverse#"+ , "primType" : "Function"+ }+ }+]
+ primitives/CLaSH.Sized.Internal.BitVector.json view
@@ -0,0 +1,432 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.size#"+ , "templateE" : "~LIT[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.maxIndex#"+ , "templateE" : "~LIT[0] - 1"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.high"+ , "templateE" : "\"1\""+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.low"+ , "templateE" : "\"0\""+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.++#"+ , "templateE" : "std_logic_vector'(~ARG[1]) & std_logic_vector'(~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.reduceAnd#"+ , "templateD" :+"reduceAnd_~SYM[0] : block+ function and_reduce (arg : std_logic_vector) return std_logic is+ variable upper, lower : std_logic;+ variable half : integer;+ variable argi : std_logic_vector (arg'length - 1 downto 0);+ variable result : std_logic;+ begin+ if (arg'length < 1) then+ result := '1';+ else+ argi := arg;+ if (argi'length = 1) then+ result := argi(argi'left);+ else+ half := (argi'length + 1) / 2; -- lsb-biased tree+ upper := and_reduce (argi (argi'left downto half));+ lower := and_reduce (argi (half - 1 downto argi'right));+ result := upper and lower;+ end if;+ end if;+ return result;+ end;+begin+ ~RESULT <= (0 => and_reduce(~ARG[1]));+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.reduceOr#"+ , "templateD" :+"reduceOr_~SYM[0] : block+ function or_reduce (arg : std_logic_vector) return std_logic is+ variable upper, lower : std_logic;+ variable half : integer;+ variable argi : std_logic_vector (arg'length - 1 downto 0);+ variable result : std_logic;+ begin+ if (arg'length < 1) then+ result := '0';+ else+ argi := arg;+ if (argi'length = 1) then+ result := argi(argi'left);+ else+ half := (argi'length + 1) / 2; -- lsb-biased tree+ upper := or_reduce (argi (argi'left downto half));+ lower := or_reduce (argi (half - 1 downto argi'right));+ result := upper or lower;+ end if;+ end if;+ return result;+ end;+begin+ ~RESULT <= (0 => or_reduce(~ARG[0]));+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.reduceXor#"+ , "templateD" :+"reduceXor_~SYM[0] : block+ function xor_reduce (arg : std_logic_vector) return std_logic is+ variable upper, lower : std_logic;+ variable half : integer;+ variable argi : std_logic_vector (arg'length - 1 downto 0);+ variable result : std_logic;+ begin+ if (arg'length < 1) then+ result := '0';+ else+ argi := arg;+ if (argi'length = 1) then+ result := argi(argi'left);+ else+ half := (argi'length + 1) / 2; -- lsb-biased tree+ upper := xor_reduce (argi (argi'left downto half));+ lower := xor_reduce (argi (half - 1 downto argi'right));+ result := upper xor lower;+ end if;+ end if;+ return result;+ end;+begin+ ~RESULT <= (0 => xor_reduce(~ARG[0]));+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.index#"+ , "comment" :+ "index# :: KnownNat n -- ARG[0]+ => BitVector n -- ARG[1]+ -> Int -- ARG[2]+ -> Bit"+ , "templateD" :+"indexBit_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+begin+ ~SYM[1] <= ~ARG[1];+ ~SYM[2] <= ~ARG[2];+ -- pragma translate_off+ process (~SYM[1],~SYM[2])+ begin+ if ~SYM[2] < ~SYM[1]'low or ~SYM[2] > ~SYM[1]'high then+ assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" downto \" & integer'image(~SYM[1]'high)) severity warning;+ ~RESULT <= ~ERRORO;+ else+ -- pragma translate_on+ ~RESULT <= ~SYM[1](~SYM[2] downto ~SYM[2]);+ -- pragma translate_off+ end if;+ end process;+ -- pragma translate_on+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.replaceBit#"+ , "comment" :+ "replaceBit# :: KnownNat n -- ARG[0]+ => BitVector n -- ARG[1]+ -> Int -- ARG[2]+ -> Bit -- ARG[3]+ -> BitVector n"+ , "templateD" :+"replaceBit_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+ signal ~SYM[3] : ~TYP[3];+begin+ ~SYM[1] <= ~ARG[1];+ ~SYM[2] <= ~ARG[2];+ ~SYM[3] <= ~ARG[3];+ process(~SYM[1],~SYM[2],~SYM[3])+ variable ~SYM[4] : ~TYP[1];+ begin+ ~SYM[4] := ~SYM[1];+ -- pragma translate_off+ if ~SYM[2] < ~SYM[4]'low or ~SYM[2] > ~SYM[4]'high then+ assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" downto \" & integer'image(~SYM[1]'high)) severity warning;+ ~SYM[4] := ~ERROR[1];+ else+ -- pragma translate_on+ ~SYM[4](~SYM[2] downto ~SYM[2]) := ~SYM[3];+ -- pragma translate_off+ end if;+ -- pragma translate_on+ ~RESULT <= ~SYM[4];+ end process;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.setSlice#"+ , "comment" :+ "setSlice# :: BitVector (m + 1 + i) -- ARG[0]+ -> SNat m -- ARG[1]+ -> SNat n -- ARG[2]+ -> BitVector (m + 1 - n) -- ARG[3]+ -> BitVector (m + 1 + i)"+ , "templateD" :+"setSlice_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+ signal ~SYM[2] : ~TYP[3];+begin+ ~SYM[1] <= ~ARG[0];+ ~SYM[2] <= ~ARG[3];+ process(~SYM[1],~SYM[2])+ variable ~SYM[3] : ~TYP[0];+ begin+ ~SYM[3] := ~SYM[1];+ ~SYM[3](~LIT[1] downto ~LIT[2]) := ~SYM[2];+ ~RESULT <= ~SYM[3];+ end process;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.slice#"+ , "comment" :+ "slice# :: BitVector (m + 1 + i) -- ARG[0]+ -> SNat m -- ARG[1]+ -> SNat n -- ARG[2]+ -> BitVector (m + 1 - n)"+ , "templateD" :+"slice_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= ~SYM[1](~LIT[1] downto ~LIT[2]);+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.split#"+ , "comment" :+ "split# :: KnownNat n -- ARG[0]+ => BitVector (m + n) -- ARG[1]+ -> (BitVector m, BitVector n)"+ , "templateD" :+"split_~SYM[0]: block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[1];+ ~RESULT <= ( ~SYM[1](~RESULT.~TYPMO_sel0'left + ~RESULT.~TYPMO_sel1'length downto+ ~RESULT.~TYPMO_sel0'right + ~RESULT.~TYPMO_sel1'length)+ , ~SYM[1](~RESULT.~TYPMO_sel1'left downto ~RESULT.~TYPMO_sel1'right)+ );+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.msb#"+ , "comment" :+ "msb# :: KnownNat n -- ARG[0]+ => BitVector n -- ARG[1]+ -> Bit"+ , "templateD" :+"msb_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[2]_generate : if ~SYM[1]'length = 0 generate+ begin+ ~RESULT <= \"0\";+ end generate;++ ~SYM[3]_generate : if ~SYM[1]'length /= 0 generate+ ~SYM[1] <= ~ARG[1];+ ~RESULT <= ~SYM[1](~SYM[1]'high downto ~SYM[1]'high);+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.lsb#"+ , "comment" :+ "lsb# :: BitVector n -- ARG[0]+ -> Bit"+ , "templateD" :+"lsb_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[2]_generate : if ~SYM[1]'length = 0 generate+ begin+ ~RESULT <= \"0\";+ end generate;++ ~SYM[3]_generate : if ~SYM[1]'length /= 0 generate+ begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= ~SYM[1](0 downto 0);+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.eq#"+ , "templateE" : "~ARG[0] = ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.neq#"+ , "templateE" : "~ARG[0] /= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.lt#"+ , "templateE" : "~ARG[0] < ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.ge#"+ , "templateE" : "~ARG[0] >= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.gt#"+ , "templateE" : "~ARG[0] > ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.le#"+ , "templateE" : "~ARG[0] <= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.minBound#"+ , "comment" : "Generates incorrect VDHL for n=0"+ , "templateE" : "std_logic_vector'(~LIT[0]-1 downto 0 => '0');"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.maxBound#"+ , "comment" : "Generates incorrect VDHL for n=0"+ , "templateE" : "std_logic_vector'(~LIT[0]-1 downto 0 => '1');"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.+#"+ , "templateE" : "std_logic_vector(unsigned(~ARG[1]) + unsigned(~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.-#"+ , "templateE" : "std_logic_vector(unsigned(~ARG[1]) - unsigned(~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.*#"+ , "templateE" : "std_logic_vector(resize(unsigned(~ARG[1]) * unsigned(~ARG[2]), ~LIT[0]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.negate#"+ , "templateE" : "std_logic_vector(-(signed(~ARG[1])))"+ }+ }+, { "Primitive" :+ { "name" : "CLaSH.Sized.Internal.BitVector.fromInteger#"+ , "primType" : "Function"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.plus#"+ , "templateE" : "std_logic_vector(resize(unsigned(~ARG[1]),~LIT[0]) + resize(unsigned(~ARG[2]),~LIT[0]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.minus#"+ , "templateE" : "std_logic_vector(resize(unsigned(~ARG[1]),~LIT[0]) - resize(unsigned(~ARG[2]),~LIT[0]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.times#"+ , "templateE" : "std_logic_vector(unsigned(~ARG[1]) * unsigned(~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.quot#"+ , "templateE" : "std_logic_vector(unsigned(~ARG[1]) / unsigned(~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.rem#"+ , "templateE" : "~ARG[1] rem ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.mod#"+ , "templateE" : "~ARG[1] mod ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.toInteger#"+ , "templateE" : "to_integer(unsigned(~ARG[0]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.and#"+ , "templateE" : "~ARG[0] and ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.or#"+ , "templateE" : "~ARG[0] or ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.xor#"+ , "templateE" : "~ARG[0] xor ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.complement#"+ , "templateE" : "not ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.shiftL#"+ , "templateE" : "std_logic_vector(shift_left(unsigned(~ARG[1]),~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.shiftR#"+ , "templateE" : "std_logic_vector(shift_right(unsigned(~ARG[1]),~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.rotateL#"+ , "templateE" : "std_logic_vector(rotate_left(unsigned(~ARG[1]),~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.rotateR#"+ , "templateE" : "std_logic_vector(rotate_right(unsigned(~ARG[1]),~ARG[2]))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.BitVector.resize#"+ , "templateE" : "std_logic_vector(resize(unsigned(~ARG[1]),~LIT[0]))"+ }+ }+]
+ primitives/CLaSH.Sized.Internal.Index.json view
@@ -0,0 +1,76 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.eq#"+ , "templateE" : "~ARG[0] = ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.neq#"+ , "templateE" : "~ARG[0] /= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.lt#"+ , "templateE" : "~ARG[0] < ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.ge#"+ , "templateE" : "~ARG[0] >= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.gt#"+ , "templateE" : "~ARG[0] > ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.le#"+ , "templateE" : "~ARG[0] <= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.maxBound#"+ , "templateE" : "to_unsigned(max(0,~LIT[0]-1),~RESULT'length);"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.+#"+ , "templateE" : "~ARG[1] + ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.-#"+ , "templateE" : "~ARG[1] - ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.*#"+ , "templateE" : "resize(~ARG[1] * ~ARG[2], ~LIT[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.fromInteger#"+ , "templateE" : "to_unsigned(~ARG[1],integer(ceil(log2(real(max(2,~LIT[0]))))))"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.quot#"+ , "templateE" : "~ARG[1] / ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.rem#"+ , "templateE" : "~ARG[1] rem ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.mod#"+ , "templateE" : "~ARG[1] mod ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Index.toInteger#"+ , "templateE" : "to_integer(~ARG[0])"+ }+ }+]
+ primitives/CLaSH.Sized.Internal.Signed.json view
@@ -0,0 +1,186 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Internal.Signed.size#"+ , "templateE" : "~LIT[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.pack#"+ , "templateE" : "std_logic_vector(~ARG[1])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.unpack#"+ , "templateE" : "signed(~ARG[1])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.eq#"+ , "templateE" : "~ARG[0] = ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.neq#"+ , "templateE" : "~ARG[0] /= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.lt#"+ , "templateE" : "~ARG[0] < ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.ge#"+ , "templateE" : "~ARG[0] >= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.gt#"+ , "templateE" : "~ARG[0] > ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.le#"+ , "templateE" : "~ARG[0] <= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.minBound#"+ , "comment" : "Generates incorrect VDHL for n=0"+ , "comment2" : "the quantification with signed gives the array an ascending index"+ , "templateE" : "signed'(0 => '1', 1 to ~LIT[0]-1 => '0')"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.maxBound#"+ , "comment" : "Generates incorrect VDHL for n=0"+ , "comment2" : "the quantification with signed gives the array an ascending index"+ , "templateE" : "signed'(0 => '0', 1 to ~LIT[0]-1 => '1')"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.+#"+ , "templateE" : "~ARG[1] + ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.-#"+ , "templateE" : "~ARG[1] - ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.*#"+ , "templateE" : "resize(~ARG[1] * ~ARG[2], ~LIT[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.negate#"+ , "templateE" : "-~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.abs#"+ , "templateE" : "abs ~ARG[1]"+ }+ }+, { "Primitive" :+ { "name" : "CLaSH.Sized.Internal.Signed.fromInteger#"+ , "primType" : "Function"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.plus#"+ , "templateE" : "resize(~ARG[1],~LIT[0]) + resize(~ARG[2],~LIT[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.minus#"+ , "templateE" : "resize(~ARG[1],~LIT[0]) - resize(~ARG[2],~LIT[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.times#"+ , "templateE" : "~ARG[1] * ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.quot#"+ , "templateE" : "~ARG[1] / ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.rem#"+ , "templateE" : "~ARG[1] rem ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.div#"+ , "templateD" :+"divSigned_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+ signal ~SYM[3] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[1];+ ~SYM[2] <= ~ARG[2];+ ~SYM[3] <= ~SYM[1] / ~SYM[2];+ ~RESULT <= ~SYM[3] - to_signed(1,~LIT[0]) when ~SYM[1](~SYM[1]'high) = not (~SYM[2](~SYM[2]'high)) else+ ~SYM[3];+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.mod#"+ , "templateE" : "~ARG[1] mod ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.toInteger#"+ , "templateE" : "to_integer(~ARG[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.and#"+ , "templateE" : "~ARG[1] and ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.or#"+ , "templateE" : "~ARG[1] or ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.xor#"+ , "templateE" : "~ARG[1] xor ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.complement#"+ , "templateE" : "not ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.shiftL#"+ , "templateE" : "shift_left(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.shiftR#"+ , "templateE" : "shift_right(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.rotateL#"+ , "templateE" : "rotate_left(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.rotateR#"+ , "templateE" : "rotate_right(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Signed.resize#"+ , "templateE" : "resize(~ARG[2],~LIT[1])"+ }+ }+]
+ primitives/CLaSH.Sized.Internal.Unsigned.json view
@@ -0,0 +1,163 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.size#"+ , "templateE" : "~LIT[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.pack#"+ , "templateE" : "std_logic_vector(~ARG[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.unpack#"+ , "templateE" : "unsigned(~ARG[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.eq#"+ , "templateE" : "~ARG[0] = ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.neq#"+ , "templateE" : "~ARG[0] /= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.lt#"+ , "templateE" : "~ARG[0] < ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.ge#"+ , "templateE" : "~ARG[0] >= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.gt#"+ , "templateE" : "~ARG[0] > ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.le#"+ , "templateE" : "~ARG[0] <= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.minBound#"+ , "comment" : "Generates incorrect VDHL for n=0"+ , "templateE" : "unsigned'(~LIT[0]-1 downto 0 => '0');"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.maxBound#"+ , "comment" : "Generates incorrect VDHL for n=0"+ , "templateE" : "unsigned'(~LIT[0]-1 downto 0 => '1');"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.+#"+ , "templateE" : "~ARG[1] + ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.-#"+ , "templateE" : "~ARG[1] - ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.*#"+ , "templateE" : "resize(~ARG[1] * ~ARG[2], ~LIT[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.negate#"+ , "templateE" : "unsigned(std_logic_vector(-(signed(std_logic_vector(~ARG[1])))))"+ }+ }+, { "Primitive" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.fromInteger#"+ , "primType" : "Function"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.plus#"+ , "templateE" : "resize(~ARG[1],~LIT[0]) + resize(~ARG[2],~LIT[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.minus#"+ , "templateE" : "resize(~ARG[1],~LIT[0]) - resize(~ARG[2],~LIT[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.times#"+ , "templateE" : "~ARG[1] * ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.quot#"+ , "templateE" : "~ARG[1] / ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.rem#"+ , "templateE" : "~ARG[1] rem ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.mod#"+ , "templateE" : "~ARG[1] mod ~ARG[2]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.toInteger#"+ , "templateE" : "to_integer(~ARG[0])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.and#"+ , "templateE" : "~ARG[0] and ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.or#"+ , "templateE" : "~ARG[0] or ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.xor#"+ , "templateE" : "~ARG[0] xor ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.complement#"+ , "templateE" : "not ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.shiftL#"+ , "templateE" : "shift_left(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.shiftR#"+ , "templateE" : "shift_right(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.rotateL#"+ , "templateE" : "rotate_left(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.rotateR#"+ , "templateE" : "rotate_right(~ARG[1],~ARG[2])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Internal.Unsigned.resize#"+ , "templateE" : "resize(~ARG[1],~LIT[0])"+ }+ }+]
+ primitives/CLaSH.Sized.Vector.json view
@@ -0,0 +1,365 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.eq#"+ , "templateE" : "~ARG[0] = ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.neq#"+ , "templateE" : "~ARG[0] /= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.head"+ , "templateD" :+"head_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= ~SYM[1](0);+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.tail"+ , "templateD" :+"tail_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= ~SYM[1](1 to ~SYM[1]'high);+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.last"+ , "templateD" :+"last_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= ~SYM[1](~SYM[1]'high);+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.init"+ , "templateD" :+"init_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= ~SYM[1](0 to ~SYM[1]'high - 1);+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.select"+ , "comment" :+ "select :: (CmpNat (i + s) (s * n) ~ GT) -- ARG[0]+ => SNat f -- ARG[1]+ -> SNat s -- ARG[2]+ -> SNat n -- ARG[3]+ -> Vec i a -- ARG[4]+ -> Vec n a"+ , "templateD" :+"select_~SYM[0] : block+ signal ~SYM[1] : ~TYP[4];+begin+ ~SYM[1] <= ~ARG[4];++ selectZ_~SYM[2] : if ~RESULT'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ selectSN_~SYM[3] : if ~RESULT'length /= 0 generate+ selectIter_~SYM[4] : for ~SYM[5] in ~RESULT'range generate+ begin+ ~RESULT(~SYM[5]) <= ~SYM[1](~LIT[1]+(~LIT[2]*~SYM[5]));+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.++"+ , "templateE" : "~TYPM[0]'(~ARG[0]) & ~TYPM[1]'(~ARG[1])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.concat"+ , "templateD" :+"concat_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];++ concatZ_~SYM[2] : if ~RESULT'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ concatSN_~SYM[3] : if ~RESULT'length /= 0 generate+ concatIter_~SYM[4] : for ~SYM[5] in ~SYM[1]'range generate+ begin+ ~RESULT((~SYM[5] * ~SYM[1](0)'length) to ((~SYM[5] * ~SYM[1](0)'length) + ~SYM[1](0)'high)) <= ~SYM[1](~SYM[5]);+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.splitAt"+ , "templateD" :+"splitAt_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[1];+ ~RESULT <= (~SYM[1](~RESULT.~TYPMO_sel0'left to ~RESULT.~TYPMO_sel0'right)+ ,~SYM[1](~RESULT.~TYPMO_sel1'left + ~RESULT.~TYPMO_sel0'length to ~RESULT.~TYPMO_sel1'right + ~RESULT.~TYPMO_sel0'length));+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.unconcat"+ , "comment" :+ "unconcat :: KnownNat n -- ARG[0]+ => SNat m -- ARG[1]+ -> Vec (n * m) a -- ARG[2]+ -> Vec n (Vec m a)"+ , "templateD" :+"unconcat_~SYM[0] : block+ signal ~SYM[1] : ~TYP[2];+begin+ ~SYM[1] <= ~ARG[2];++ unconcatZ_~SYM[2] : if ~SYM[1]'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ unconcatSN_~SYM[3] : if ~SYM[1]'length /= 0 generate+ unconcatIter_~SYM[4] : for ~SYM[5] in ~RESULT'range generate+ begin+ ~RESULT(~SYM[5]) <= ~SYM[1]((~SYM[5] * ~LIT[1]) to ((~SYM[5] * ~LIT[1]) + ~LIT[1] - 1));+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.merge"+ , "templateD" :+"merge_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+ signal ~SYM[2] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[0];+ ~SYM[2] <= ~ARG[1];++ mergeZ_~SYM[3] : if ~RESULT'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ mergeSN_~SYM[4] : if ~RESULT'length /= 0 generate+ mergeIter_~SYM[5] : for ~SYM[6] in ~SYM[1]'range generate+ begin+ ~RESULT(2*~SYM[6]) <= ~SYM[1](~SYM[6]);+ ~RESULT(2*~SYM[6]+1) <= ~SYM[2](~SYM[6]);+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.map"+ , "templateD" :+"map_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[1];++ mapZ_~SYM[2] : if ~RESULT'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ mapSN_~SYM[3] : if ~RESULT'length /= 0 generate+ mapIter_~SYM[4] : for ~SYM[5] in ~RESULT'range generate+ begin+ ~INST 0+ ~OUTPUT <= ~RESULT(~SYM[5])~ ~TYPEL[~TYPO]~+ ~INPUT <= ~SYM[1](~SYM[5])~ ~TYPEL[~TYP[1]]~+ ~INST+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.zipWith"+ , "templateD" :+"zipWith_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+begin+ ~SYM[1] <= ~ARG[1];+ ~SYM[2] <= ~ARG[2];++ zipWithZ_~SYM[3] : if ~RESULT'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ zipWithSN_~SYM[4] : if ~RESULT'length /= 0 generate+ zipWithIter_~SYM[5] : for ~SYM[6] in ~RESULT'range generate+ begin+ ~INST 0+ ~OUTPUT <= ~RESULT(~SYM[6])~ ~TYPEL[~TYPO]~+ ~INPUT <= ~SYM[1](~SYM[6])~ ~TYPEL[~TYP[1]]~+ ~INPUT <= ~SYM[2](~SYM[6])~ ~TYPEL[~TYP[2]]~+ ~INST+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.index_integer"+ , "templateD" :+"indexVec_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+begin+ ~SYM[1] <= ~ARG[1];+ ~SYM[2] <= ~ARG[2];+ -- pragma translate_off+ process (~SYM[1],~SYM[2])+ begin+ if ~SYM[2] < ~SYM[1]'low or ~SYM[2] > ~SYM[1]'high then+ assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" to \" & integer'image(~SYM[1]'high)) severity warning;+ ~RESULT <= ~ERRORO;+ else+ -- pragma translate_on+ ~RESULT <= ~SYM[1](~SYM[2]);+ -- pragma translate_off+ end if;+ end process;+ -- pragma translate_on+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.replace_integer"+ , "templateD" :+"replaceVec_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+ signal ~SYM[2] : ~TYP[2];+ signal ~SYM[3] : ~TYP[3];+begin+ ~SYM[1] <= ~ARG[1];+ ~SYM[2] <= ~ARG[2];+ ~SYM[3] <= ~ARG[3];+ process(~SYM[1],~SYM[2],~SYM[3])+ variable ~SYM[4] : ~TYP[1];+ begin+ ~SYM[4] := ~SYM[1];+ -- pragma translate_off+ if ~SYM[2] < ~SYM[4]'low or ~SYM[2] > ~SYM[4]'high then+ assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" to \" & integer'image(~SYM[1]'high)) severity warning;+ ~SYM[4] := ~ERROR[1];+ else+ -- pragma translate_on+ ~SYM[4](~SYM[2]) := ~SYM[3];+ -- pragma translate_off+ end if;+ -- pragma translate_on+ ~RESULT <= ~SYM[4];+ end process;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.maxIndex"+ , "templateE" : "~LIT[0] - 1"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.length"+ , "templateE" : "~LIT[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.replicate"+ , "templateE" : "~TYPMO'(0 to ~LIT[0]-1 => ~ARG[1])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.reverse"+ , "templateD" :+"reverse_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];++ reverseZ_~SYM[2] : if ~RESULT'length = 0 generate+ ~RESULT <= ~SYM[1];+ end generate;++ reverseSN_~SYM[3] : if ~RESULT'length /= 0 generate+ reverseIter_~SYM[4] : for ~SYM[5] in ~SYM[1]'range generate+ ~RESULT(~SYM[1]'high - ~SYM[5]) <= ~SYM[1](~SYM[5]);+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.lazyV"+ , "templateE" : "~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.concatBitVector#"+ , "comment" :+ "concatBitVector# :: KnownNat m -- ARG[0]+ => Vec n (BitVector m) -- ARG[1]+ -> BitVector (n * m)"+ , "templateD" :+"concatBitVector_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[1];++ concatBitVectorZ_~SYM[2] : if ~RESULT'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ concatBitVectorSN_~SYM[3] : if ~RESULT'length /= 0 generate+ concatBitVectorIter_~SYM[4] : for ~SYM[5] in ~SYM[1]'range generate+ ~RESULT(((~SYM[5] * ~LIT[0]) + ~LIT[0] - 1) downto (~SYM[5] * ~LIT[0])) <= ~TYPMO(~SYM[1](~SYM[5]));+ end generate;+ end generate;+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.Vector.unconcatBitVector#"+ , "comment" :+ "unconcatBitVector# :: (KnownNat n, KnownNat m) -- (ARG[0],ARG[1])+ => BitVector (n * m) -- ARG[2]+ -> Vec n (BitVector m)"+ , "templateD" :+"unconcatBitVector_~SYM[0] : block+ signal ~SYM[1] : ~TYP[2];+begin+ ~SYM[1] <= ~ARG[2];++ unconcatBitVectorZ_~SYM[2] : if ~SYM[1]'length = 0 generate+ ~RESULT <= ~ERRORO;+ end generate;++ unconcatBitVectorSN_~SYM[3] : if ~SYM[1]'length /= 0 generate+ unconcatBitVectorIter_~SYM[4] : for ~SYM[5] in ~RESULT'range generate+ ~RESULT(~SYM[5]) <= ~SYM[1](((~SYM[5] * ~LIT[1]) + ~LIT[1] - 1) downto (~SYM[5] * ~LIT[1]));+ end generate;+ end generate;+end block;"+ }+ }+]
+ primitives/Control.Exception.Base.json view
@@ -0,0 +1,21 @@+[ { "BlackBox" :+ { "name" : "Control.Exception.Base.patError"+ , "templateE" : "~ERRORO"+ }+ }+, { "BlackBox" :+ { "name" : "Control.Exception.Base.irrefutPatError"+ , "templateE" : "~ERRORO"+ }+ }+, { "BlackBox" :+ { "name" : "Control.Exception.Base.recSelError"+ , "templateE" : "~ERRORO"+ }+ }+, { "BlackBox" :+ { "name" : "Control.Exception.Base.absentError"+ , "templateE" : "~ERRORO"+ }+ }+]
+ primitives/GHC.Base.json view
@@ -0,0 +1,33 @@+[ { "Primitive" :+ { "name" : "GHC.Base.$"+ , "primType" : "Function"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Base.quotInt"+ , "templateE" : "~ARG[0] div ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Base.remInt"+ , "templateE" : "~ARG[0] rem ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Base.divInt"+ , "templateD" :+"divInt_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[0] / ~ARG[1];+ ~RESULT <= ~SYM[1] - 1 when ((~ARG[0] = abs ~ARG[0]) /= (~ARG[1] = abs ~ARG[1])) else+ ~SYM[1];+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Base.modInt"+ , "templateE" : "~ARG[0] mod ~ARG[1]"+ }+ }+]
+ primitives/GHC.CString.json view
@@ -0,0 +1,11 @@+[ { "Primitive" :+ { "name" : "GHC.CString.unpackCString#"+ , "primType" : "Function"+ }+ }+, { "Primitive" :+ { "name" : "GHC.CString.unpackCStringUtf8#"+ , "primType" : "Function"+ }+ }+]
+ primitives/GHC.Classes.json view
@@ -0,0 +1,63 @@+[ { "BlackBox" :+ { "name" : "GHC.Classes.eqInt"+ , "templateE" : "~ARG[0] = ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.neInt"+ , "templateE" : "~ARG[0] /= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.gtInt"+ , "templateE" : "~ARG[0] > ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.geInt"+ , "templateE" : "~ARG[0] >= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.ltInt"+ , "templateE" : "~ARG[0] < ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.leInt"+ , "templateE" : "~ARG[0] <= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.&&"+ , "templateE" : "~ARG[0] and ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.||"+ , "templateE" : "~ARG[0] or ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.not"+ , "templateE" : "not ~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.divInt#"+ , "templateD" :+"divInt_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[0] / ~ARG[1];+ ~RESULT <= ~SYM[1] - 1 when ((~ARG[0] = abs ~ARG[0]) /= (~ARG[1] = abs ~ARG[1])) else+ ~SYM[1];+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Classes.modInt#"+ , "templateE" : "~ARG[0] mod ~ARG[1]"+ }+ }+]
+ primitives/GHC.Err.json view
@@ -0,0 +1,11 @@+[ { "BlackBox" :+ { "name" : "GHC.Err.error"+ , "templateE" : "~ERRORO"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Err.undefined"+ , "templateE" : "~ERRORO"+ }+ }+]
+ primitives/GHC.Integer.Type.json view
@@ -0,0 +1,133 @@+[ { "BlackBox" :+ { "name" : "GHC.Integer.Type.smallInteger"+ , "templateE" : "~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.integerToInt"+ , "templateE" : "~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.plusInteger"+ , "templateE" : "~ARG[0] + ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.minusInteger"+ , "templateE" : "~ARG[0] - ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.timesInteger"+ , "templateE" : "~ARG[0] * ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.negateInteger"+ , "templateE" : "-~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.absInteger"+ , "templateE" : "abs ~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.divInteger"+ , "templateD" :+"divInteger_~SYM[0] : block+ signal ~SYM[1] : ~TYP[1];+begin+ ~SYM[1] <= ~ARG[0] / ~ARG[1];+ ~RESULT <= ~SYM[1] - 1 when ((~ARG[0] = abs ~ARG[0]) /= (~ARG[1] = abs ~ARG[1])) else+ ~SYM[1];+end block;"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.modInteger"+ , "templateE" : "~ARG[0] mod ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.quotInteger"+ , "templateE" : "~ARG[0] div ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.remInteger"+ , "templateE" : "~ARG[0] rem ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.eqInteger"+ , "templateE" : "~ARG[0] = ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.neqInteger"+ , "templateE" : "~ARG[0] /= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.leInteger"+ , "templateE" : "~ARG[0] <= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.gtInteger"+ , "templateE" : "~ARG[0] > ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.ltInteger"+ , "templateE" : "~ARG[0] < ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.geInteger"+ , "templateE" : "~ARG[0] >= ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.eqInteger#"+ , "templateE" : "1 when ~ARG[0] = ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.neqInteger#"+ , "templateE" : "1 when ~ARG[0] /= ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.leInteger#"+ , "templateE" : "1 when ~ARG[0] <= ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.gtInteger#"+ , "templateE" : "1 when ~ARG[0] > ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.ltInteger#"+ , "templateE" : "1 when ~ARG[0] < ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.geInteger#"+ , "templateE" : "1 when ~ARG[0] >= ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.shiftRInteger"+ , "templateE" : "~ARG[0] / (2**~ARG[1])"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Integer.Type.shiftLInteger"+ , "templateE" : "~ARG[0] * (2**~ARG[1])"+ }+ }+]
+ primitives/GHC.Prim.json view
@@ -0,0 +1,76 @@+[ { "BlackBox" :+ { "name" : "GHC.Prim.+#"+ , "templateE" : "~ARG[0] + ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.-#"+ , "templateE" : "~ARG[0] - ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.*#"+ , "templateE" : "~ARG[0] * ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.quotInt#"+ , "templateE" : "~ARG[0] div ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.remInt#"+ , "templateE" : "~ARG[0] rem ~ARG[1]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.negateInt#"+ , "templateE" : "-~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.>#"+ , "templateE" : "1 when ~ARG[0] > ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.>=#"+ , "templateE" : "1 when ~ARG[0] >= ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.==#"+ , "templateE" : "1 when ~ARG[0] = ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim./=#"+ , "templateE" : "1 when ~ARG[0] /= ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.<#"+ , "templateE" : "1 when ~ARG[0] < ~ARG[1] else 0"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.<=#"+ , "templateE" : "1 when ~ARG[0] <= ~ARG[1] else 0"+ }+ }+, { "Primitive" :+ { "name" : "GHC.Prim.dataToTag#"+ , "primType" : "Function"+ }+ }+, { "Primitive" :+ { "name" : "GHC.Prim.tagToEnum#"+ , "primType" : "Function"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Prim.unsafeCoerce#"+ , "templateE" : "~ARG[0]"+ }+ }+]
+ primitives/GHC.Real.json view
@@ -0,0 +1,16 @@+[ { "BlackBox" :+ { "name" : "GHC.Real.divZeroError"+ , "templateE" : "~ERRORO"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Real.ratioZeroDenominatorError"+ , "templateE" : "~ERRORO"+ }+ }+, { "BlackBox" :+ { "name" : "GHC.Real.overflowError"+ , "templateE" : "~ERRORO"+ }+ }+]
+ primitives/GHC.Typelits.json view
@@ -0,0 +1,6 @@+[ { "BlackBox" :+ { "name" : "GHC.TypeLits.natVal"+ , "templateE" : "~LIT[0]"+ }+ }+]
+ primitives/GHC.Types.json view
@@ -0,0 +1,11 @@+[ { "Primitive" :+ { "name" : "GHC.Types.Eq#"+ , "primType" : "Constructor"+ }+ }+, { "Primitive" :+ { "name" : "GHC.Types.MkCoercible"+ , "primType" : "Constructor"+ }+ }+]
+ primitives/Unsafe.Coerce.json view
@@ -0,0 +1,6 @@+[ { "BlackBox" :+ { "name" : "Unsafe.Coerce.unsafeCoerce"+ , "templateE" : "~ARG[0]"+ }+ }+]
− primitives/clash.bit.json
@@ -1,26 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Bit.eqBit"- , "templateE" : "~ARG[0] = ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Bit.bAnd"- , "templateE" : "~ARG[0] and ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Bit.bOr"- , "templateE" : "~ARG[0] or ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Bit.bXor"- , "templateE" : "~ARG[0] xor ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Bit.bNot"- , "templateE" : "not ~ARG[0]"- }- }-]
− primitives/clash.ghc.ghc2core.json
@@ -1,16 +0,0 @@-[ { "BlackBox" :- { "name" : "EmptyCase"- , "templateE" : "~ERRORO"- }- }-, { "Primitive" :- { "name" : "_CO_"- , "primType" : "Constructor"- }- }-, { "Primitive" :- { "name" : "_TY_"- , "primType" : "Constructor"- }- }-]
− primitives/clash.prelude.explicit.json
@@ -1,51 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Prelude.Explicit.cblockRam"- , "comment" :- "cblockRam :: (CPack a, KnownNat n, KnownNat m) -- (ARG[0],ARG[1],ARG[2])- => Clock clk -- clk, ARG[3]- -> Vec n a -- init, ARG[4]- -> CSignal clk (Unsigned m) -- wr, ARG[5]- -> CSignal clk (Unsigned m) -- rd, ARG[6]- -> CSignal clk Bool -- wren, ARG[7]- -> CSignal clk a -- din, ARG[8]- -> CSignal clk a"- , "templateD" :-"~SYM[0]_block : block- signal ~SYM[1] : ~TYP[4] := ~LIT[4]; -- ram- signal ~SYM[2] : ~TYP[8]; -- inp- signal ~SYM[3] : ~TYP[8]; -- outp-begin- ~SYM[2] <= ~ARG[8];-- process(~CLKO)- begin- if rising_edge(~CLKO) then- if ~ARG[7] then- ~SYM[1](to_integer(~ARG[5])) <= ~SYM[2];- end if;- ~SYM[3] <= ~SYM[1](to_integer(~ARG[6]));- end if;- end process;-- ~RESULT <= ~SYM[3];-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Prelude.Explicit.csassert"- , "templateD" :-"~SYM[0]_block : block-begin- -- pragma translate_off- process(~CLK[2],~RST[2],~ARG[2],~ARG[3]) is- begin- if (rising_edge(~CLK[2]) or rising_edge(~RST[2])) then- assert (~ARG[2] = ~ARG[3]) report (\"expected: \" & to_string (~ARG[3]) & \", actual: \" & to_string (~ARG[2])) severity error;- end if;- end process;- -- pragma translate_on- ~RESULT <= ~ARG[4];-end block;"- }- }-]
− primitives/clash.prelude.json
@@ -1,50 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Prelude.blockRam"- , "comment" :- "blockRam :: (Pack a, KnownNat n, KnownNat m) -- (ARG[0],ARG[1],ARG[2])- => Vec n a -- init, ARG[3]- -> Signal (Unsigned m) -- write, ARG[4]- -> Signal (Unsigned m) -- read, ARG[5]- -> Signal Bool -- wen, ARG[6]- -> Signal a -- din, ARG[7]- -> Signal a"- , "templateD" :-"~SYM[0]_block : block- signal ~SYM[1] : ~TYP[3] := ~LIT[3]; -- ram- signal ~SYM[2] : ~TYP[7]; -- inp- signal ~SYM[3] : ~TYP[7]; -- outp-begin- ~SYM[2] <= ~ARG[7];-- process(~CLKO)- begin- if rising_edge(~CLKO) then- if ~ARG[6] then- ~SYM[1](to_integer(~ARG[4])) <= ~SYM[2];- end if;- ~SYM[3] <= ~SYM[1](to_integer(~ARG[5]));- end if;- end process;-- ~RESULT <= ~SYM[3];-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Prelude.sassert"- , "templateD" :-"~SYM[0]_block : block-begin- -- pragma translate_off- process(~CLK[2],~RST[2],~ARG[2],~ARG[3]) is- begin- if (rising_edge(~CLK[2]) or rising_edge(~RST[2])) then- assert (~ARG[2] = ~ARG[3]) report (\"expected: \" & to_string (~ARG[3]) & \", actual: \" & to_string (~ARG[2])) severity error;- end if;- end process;- -- pragma translate_on- ~RESULT <= ~ARG[4];-end block;"- }- }-]
− primitives/clash.promoted.nat.json
@@ -1,11 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.SNat"- , "templateE" : "~LIT[0]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.fromSNat"- , "templateE" : "~LIT[0]"- }- }-]
− primitives/clash.signal.explicit.json
@@ -1,38 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Signal.Explicit.cregister"- , "templateD" :-"~SYM[0]_block : block- signal ~SYM[1] : ~TYP[2];- signal ~SYM[2] : ~TYP[1];-begin- ~SYM[2] <= ~ARG[1];-- process(~CLKO,~RSTO,~SYM[2])- begin- if ~RSTO = '0' then- ~SYM[1] <= ~SYM[2];- elsif rising_edge(~CLKO) then- ~SYM[1] <= ~ARG[2];- end if;- end process;-- ~RESULT <= ~SYM[1];-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Signal.Explicit.veryUnsafeSynchronizer"- , "templateE" : "~ARG[2]"- }- }-, { "Primitive" :- { "name" : "CLaSH.Signal.Explicit.cpack"- , "primType" : "Function"- }- }-, { "Primitive" :- { "name" : "CLaSH.Signal.Explicit.cunpack"- , "primType" : "Function"- }- }-]
− primitives/clash.signal.implicit.json
@@ -1,33 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Signal.Implicit.register"- , "templateD" :-"~SYM[0]_block : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[0];-begin- ~SYM[2] <= ~ARG[0]; -- process(~CLKO,~RSTO,~SYM[2])- begin- if ~RSTO = '0' then- ~SYM[1] <= ~SYM[2];- elsif rising_edge(~CLKO) then- ~SYM[1] <= ~ARG[1];- end if;- end process;-- ~RESULT <= ~SYM[1];-end block;"- }- }-, { "Primitive" :- { "name" : "CLaSH.Signal.Implicit.pack"- , "primType" : "Function"- }- }-, { "Primitive" :- { "name" : "CLaSH.Signal.Implicit.unpack"- , "primType" : "Function"- }- }-]
− primitives/clash.signal.types.json
@@ -1,16 +0,0 @@-[ { "Primitive" :- { "name" : "CLaSH.Signal.Types.signal"- , "primType" : "Function"- }- }-, { "Primitive" :- { "name" : "CLaSH.Signal.Types.mapSignal"- , "primType" : "Function"- }- }-, { "Primitive" :- { "name" : "CLaSH.Signal.Types.appSignal"- , "primType" : "Function"- }- }-]
− primitives/clash.sized.signed.json
@@ -1,227 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.eqS"- , "templateE" : "~ARG[0] = ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.gtS"- , "templateE" : "~ARG[0] > ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.ltS"- , "templateE" : "~ARG[0] < ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.geS"- , "templateE" : "~ARG[0] >= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.leS"- , "templateE" : "~ARG[0] <= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.minBoundS"- , "templateD" : "~RESULT <= ((~LIT[0]-1) => '1', (~LIT[0]-2) downto 0 => '0');"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.maxBoundS"- , "templateD" : "~RESULT <= ((~LIT[0]-1) => '0', (~LIT[0]-2) downto 0 => '1');"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.plusS"- , "templateE" : "~ARG[1] + ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.minS"- , "templateE" : "~ARG[1] - ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.timesS"- , "templateE" : "resize(~ARG[1] * ~ARG[2], ~LIT[0])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.negateS"- , "templateE" : "-~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.absS"- , "templateE" : "abs ~ARG[1]"- }- }-, { "Primitive" :- { "name" : "CLaSH.Sized.Signed.fromIntegerS"- , "primType" : "Function"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.quotS"- , "templateE" : "~ARG[1] / ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.remS"- , "templateE" : "~ARG[1] rem ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.divS"- , "templateD" :-"~SYM[0]_divS : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[2];- signal ~SYM[3] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~SYM[2] <= ~ARG[2];- ~SYM[3] <= ~SYM[1] / ~SYM[2];- ~RESULT <= ~SYM[3] - to_signed(1,~LIT[0]) when ~SYM[1](~SYM[1]'high) = not (~SYM[2](~SYM[2]'high)) else- ~SYM[3];-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.modS"- , "templateE" : "~ARG[1] mod ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.toIntegerS"- , "templateE" : "to_integer(~ARG[0])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.andS"- , "templateE" : "~ARG[1] and ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.orS"- , "templateE" : "~ARG[1] or ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.xorS"- , "templateE" : "~ARG[1] xor ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.complementS"- , "templateE" : "not ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.bitS"- , "templateD" :-"~SYM[0]_bitS : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- process(~SYM[1])- variable ~SYM[2] : ~TYPO;- begin- ~SYM[2] := (others => '0');- -- pragma translate_off- if ~SYM[1] < ~SYM[2]'low or ~SYM[1] > ~SYM[2]'high then- assert false report (\"Index: \" & integer'image(~SYM[1]) & \", is out of bounds: \" & integer'image(~SYM[2]'low) & \" downto \" & integer'image(~SYM[2]'high)) severity warning;- ~SYM[2] := ~ERRORO;- else- -- pragma translate_on- ~SYM[2](~SYM[1]) := '1';- -- pragma translate_off- end if;- -- pragma translate_on;- ~RESULT <= ~SYM[2];- end process;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.testBitS"- , "templateD" :-"~SYM[0]_testBitS : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[2];-begin- ~SYM[1] <= ~ARG[1];- ~SYM[2] <= ~ARG[2];- -- pragma translate_off- process(~SYM[1],~SYM[2]) begin- if ~SYM[2] < ~SYM[1]'low or ~SYM[2] > ~SYM[1]'high then- assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" downto \" & integer'image(~SYM[1]'high)) severity warning;- ~RESULT <= ~ERRORO;- else- -- pragma translate_on- ~RESULT <= ~SYM[1](~SYM[2]) = '1';- -- pragma translate_off- end if;- end process;- -- pragma translate_on-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.shiftLS"- , "templateE" : "shift_left(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.shiftRS"- , "templateE" : "shift_right(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.rotateLS"- , "templateE" : "rotate_left(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.rotateRS"- , "templateE" : "rotate_right(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.finiteBitSizeS"- , "templateE" : "~LIT[0]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.toBitVector"- , "templateE" : "std_logic_vector(~ARG[1])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.fromBitVector"- , "templateE" : "signed(~ARG[1])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.resizeS"- , "templateE" : "resize(~ARG[2],~LIT[1])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.plusS2"- , "templateE" : "~ARG[1] + ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.minusS2"- , "templateE" : "~ARG[1] - ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Signed.multS2"- , "templateE" : "~ARG[1] * ~ARG[2]"- }- }-]
− primitives/clash.sized.unsigned.json
@@ -1,196 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.eqU"- , "templateE" : "~ARG[0] = ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.gtU"- , "templateE" : "~ARG[0] > ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.ltU"- , "templateE" : "~ARG[0] < ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.geU"- , "templateE" : "~ARG[0] >= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.leU"- , "templateE" : "~ARG[0] <= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.maxBoundU"- , "templateE" : "unsigned'((~LIT[0]-1) downto 0 => '1')"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.plusU"- , "templateE" : "~ARG[1] + ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.minU"- , "templateE" : "~ARG[1] - ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.timesU"- , "templateE" : "resize(~ARG[1] * ~ARG[2], ~LIT[0])"- }- }-, { "Primitive" :- { "name" : "CLaSH.Sized.Unsigned.fromIntegerU"- , "primType" : "Function"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.quotU"- , "templateE" : "~ARG[1] / ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.remU"- , "templateE" : "~ARG[1] rem ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.modU"- , "templateE" : "~ARG[1] mod ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.toIntegerU"- , "templateE" : "to_integer(~ARG[0])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.andU"- , "templateE" : "~ARG[1] and ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.orU"- , "templateE" : "~ARG[1] or ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.xorU"- , "templateE" : "~ARG[1] xor ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.complementU"- , "templateE" : "not ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.bitU"- , "templateD" :-"~SYM[0]_bitU : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- process(~SYM[1])- variable ~SYM[2] : ~TYPO;- begin- ~SYM[2] := (others => '0');- -- pragma translate_off- if ~SYM[1] < ~SYM[2]'low or ~SYM[1] > ~SYM[2]'high then- assert false report (\"Index: \" & integer'image(~SYM[1]) & \", is out of bounds: \" & integer'image(~SYM[2]'low) & \" downto \" & integer'image(~SYM[2]'high)) severity warning;- ~SYM[2] := ~ERRORO;- else- -- pragma translate_on- ~SYM[2](~SYM[1]) := '1';- -- pragma translate_off- end if;- -- pragma translate_on;- ~RESULT <= ~SYM[2];- end process;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.testBitU"- , "templateD" :-"~SYM[0]_testBitU : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[2];-begin- ~SYM[1] <= ~ARG[1];- ~SYM[2] <= ~ARG[2];- -- pragma translate_off- process(~SYM[1],~SYM[2]) begin- if ~SYM[2] < ~SYM[1]'low or ~SYM[2] > ~SYM[1]'high then- assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" downto \" & integer'image(~SYM[1]'high)) severity warning;- ~RESULT <= ~ERRORO;- else- -- pragma translate_on- ~RESULT <= ~SYM[1](~SYM[2]) = '1';- -- pragma translate_off- end if;- end process;- -- pragma translate_on-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.shiftLU"- , "templateE" : "shift_left(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.shiftRU"- , "templateE" : "shift_right(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.rotateLU"- , "templateE" : "rotate_left(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.rotateRU"- , "templateE" : "rotate_right(~ARG[1],~ARG[2])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.finiteBitSizeU"- , "templateE" : "~LIT[0]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.toBitVector"- , "templateE" : "std_logic_vector(~ARG[1])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.fromBitVector"- , "templateE" : "unsigned(~ARG[1])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.resizeU"- , "templateE" : "resize(~ARG[1],~LIT[0])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.plusU2"- , "templateE" : "~ARG[1] + ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.minusU2"- , "templateE" : "~ARG[1] - ~ARG[2]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Unsigned.multU2"- , "templateE" : "~ARG[1] * ~ARG[2]"- }- }-]
− primitives/clash.sized.vector.json
@@ -1,437 +0,0 @@-[ { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vhead"- , "templateD" :-"~SYM[0]_vhead : block- signal ~SYM[1] : ~TYP[0];-begin- ~SYM[1] <= ~ARG[0];- ~RESULT <= ~SYM[1](~SYM[1]'high);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vtail"- , "templateD" :-"~SYM[0]_vtail : block- signal ~SYM[1] : ~TYP[0];-begin- ~SYM[1] <= ~ARG[0];- ~RESULT <= ~SYM[1]((~SYM[1]'high)-1 downto 0);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vlast"- , "templateD" :-"~SYM[0]_vlast : block- signal ~SYM[1] : ~TYP[0];-begin- ~SYM[1] <= ~ARG[0];- ~RESULT <= ~SYM[1](0);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vinit"- , "templateD" :-"~SYM[0]_vinit : block- signal ~SYM[1] : ~TYP[0];-begin- ~SYM[1] <= ~ARG[0];- ~RESULT <= ~SYM[1](~SYM[1]'high downto 1);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.shiftIntoL"- , "templateD" :-"~SYM[0]_shiftIntoL : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~RESULT <= ~TYPM[0]'(~ARG[0]) & ~SYM[1](~SYM[1]'high downto 1);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.snoc"- , "templateE" : "~TYPM[1]'(~ARG[1]) & ~TYPM[0]'(~ARG[0])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.shiftIntoR"- , "templateD" :-"~SYM[0]_shiftIntoR : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~RESULT <= ~SYM[1]((~SYM[1]'high)-1 downto 0) & ~TYPM[0]'(~ARG[0]);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vappend"- , "templateE" : "~TYPM[0]'(~ARG[0]) & ~TYPM[1]'(~ARG[1])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vsplit"- , "templateD" :-"~SYM[0]_vsplit : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~RESULT <= (~SYM[1](~SYM[1]'high downto (~SYM[1]'high - ~LIT[0] + 1)),~SYM[1]((~SYM[1]'high - ~LIT[0]) downto 0));-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vconcat"- , "templateD" :-"~SYM[0]_vconcat : block- signal ~SYM[1] : ~TYP[0];-begin- ~SYM[1] <= ~ARG[0];- ~SYM[2]_vconcat : for ~SYM[3] in ~ARG[0]'high downto 0 generate- begin- ~RESULT(((~SYM[3] * ~SYM[1](0)'length) + ~SYM[1](0)'high) downto (~SYM[3] * ~SYM[1](0)'length)) <= ~SYM[1](~SYM[3]);- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vunconcat"- , "templateD" :-"~SYM[0]_vunconcat : block- signal ~SYM[1] : ~TYP[2];-begin- ~SYM[1] <= ~ARG[2];- ~SYM[2]_vunconcat : for ~SYM[3] in ~RESULT'high downto 0 generate- begin- ~RESULT(~SYM[3]) <= ~SYM[1](((~SYM[3] * ~RESULT(0)'length) + ~RESULT(0)'high) downto (~SYM[3] * ~RESULT(0)'length));- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vmerge"- , "templateD" :-"~SYM[0]_vmerge : block- signal ~SYM[1] : ~TYP[0];- signal ~SYM[2] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[0];- ~SYM[2] <= ~ARG[1];-- ~SYM[3]_vmerge : for ~SYM[4] in ~SYM[1]'high downto 0 generate- begin- ~RESULT(2*~SYM[4]+1) <= ~SYM[1](~SYM[4]);- ~RESULT(2*~SYM[4]) <= ~SYM[2](~SYM[4]);- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vreverse"- , "templateD" :-"~SYM[0]_vreverse : block- signal ~SYM[1] : ~TYP[0];-begin- ~SYM[1] <= ~ARG[0];-- process(~SYM[1])- begin- for ~SYM[2] in ~SYM[1]'range loop- ~RESULT(~SYM[1]'high - ~SYM[2]) <= ~SYM[1](~SYM[2]);- end loop;- end process;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vmap"- , "templateD" :-"~SYM[0]_vmap : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];-- ~SYM[2]_vmap : for ~SYM[3] in ~RESULT'high downto 0 generate- begin- ~INST 0- ~OUTPUT <= ~RESULT(~SYM[3])~ ~TYPEL[~TYPO]~- ~INPUT <= ~SYM[1](~SYM[3])~ ~TYPEL[~TYP[1]]~- ~INST- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vzipWith"- , "templateD" :-"~SYM[0]_vzipWith : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[2];-begin- ~SYM[1] <= ~ARG[1];- ~SYM[2] <= ~ARG[2];-- ~SYM[3]_generate : for ~SYM[4] in ~RESULT'high downto 0 generate- begin- ~INST 0- ~OUTPUT <= ~RESULT(~SYM[4])~ ~TYPEL[~TYPO]~- ~INPUT <= ~SYM[1](~SYM[4])~ ~TYPEL[~TYP[1]]~- ~INPUT <= ~SYM[2](~SYM[4])~ ~TYPEL[~TYP[2]]~- ~INST- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vfoldr"- , "templateD" :-"~SYM[0]_vfoldr : block- type ~SYM[7] is array (integer range <>) of ~TYP[1];- signal ~SYM[6] : ~TYP[2];- signal ~SYM[1] : ~SYM[7](~SYM[6]'high downto 0);-begin- ~SYM[1](0) <= ~ARG[1];- ~SYM[6] <= ~ARG[2];-- ~SYM[2]_generate : for ~SYM[3] in 0 to ~SYM[6]'high generate- begin- ~SYM[4]_generate : if ~SYM[3] /= (~SYM[6]'high) generate- ~INST 0- ~OUTPUT <= ~SYM[1](~SYM[3]+1)~ ~TYP[1]~- ~INPUT <= ~SYM[6](~SYM[3])~ ~TYPEL[~TYP[2]]~- ~INPUT <= ~SYM[1](~SYM[3])~ ~TYP[1]~- ~INST- end generate;-- ~SYM[5]_generate : if ~SYM[3] = (~SYM[6]'high) generate- ~INST 0- ~OUTPUT <= ~RESULT~ ~TYPO~- ~INPUT <= ~SYM[6](~SYM[3])~ ~TYPEL[~TYP[2]]~- ~INPUT <= ~SYM[1](~SYM[3])~ ~TYP[1]~- ~INST- end generate;- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vfoldl"- , "templateD" :-"~SYM[0]_vfoldl : block- type ~SYM[7] is array (integer range <>) of ~TYP[1];- signal ~SYM[6] : ~TYP[2];- signal ~SYM[1] : ~SYM[7](~SYM[6]'high downto 0);-begin- ~SYM[1](~SYM[1]'high) <= ~ARG[1];- ~SYM[6] <= ~ARG[2];-- ~SYM[2]_generate : for ~SYM[3] in ~SYM[6]'high downto 0 generate- begin- ~SYM[4]_generate : if ~SYM[3] /= 0 generate- ~INST 0- ~OUTPUT <= ~SYM[1](~SYM[3]-1)~ ~TYP[1]~- ~INPUT <= ~SYM[1](~SYM[3])~ ~TYP[1]~- ~INPUT <= ~SYM[6](~SYM[3])~ ~TYPEL[~TYP[2]]~- ~INST- end generate;-- ~SYM[5]_generate : if ~SYM[3] = 0 generate- ~INST 0- ~OUTPUT <= ~RESULT~ ~TYPO~- ~INPUT <= ~SYM[1](~SYM[3])~ ~TYP[1]~- ~INPUT <= ~SYM[6](~SYM[3])~ ~TYPEL[~TYP[2]]~- ~INST- end generate;- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vfoldr1"- , "templateD" :-"~SYM[0]_vfoldr1 : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~SYM[2](0) <= SYM[1](0);-- ~SYM[3]_generate : for ~SYM[4] in 1 to ~SYM[2]'high generate- begin- ~INST 0- ~OUTPUT <= ~SYM[2](~SYM[4])~ ~TYPEL[~TYP[1]]~- ~INPUT <= ~SYM[1](~SYM[4])~ ~TYPEL[~TYP[1]]~- ~INPUT <= ~SYM[2](~SYM[4]-1)~ ~TYPEL[~TYP[1]]~- ~INST- end generate;-- ~RESULT <= ~SYM[2](~SYM[2]'high);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vindex_integer"- , "templateD" :-"~SYM[0]_vindex_integer : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[2];-begin- ~SYM[1] <= ~ARG[1];- ~SYM[2] <= ~ARG[2];- -- pragma translate_off- process (~SYM[1],~SYM[2])- begin- if ~SYM[2] < ~SYM[1]'low or ~SYM[2] > ~SYM[1]'high then- assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" downto \" & integer'image(~SYM[1]'high)) severity warning;- ~RESULT <= ~ERRORO;- else- -- pragma translate_on- ~RESULT <= ~SYM[1](~SYM[2]);- -- pragma translate_off- end if;- end process;- -- pragma translate_on-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.maxIndex"- , "templateD" :-"~SYM[0]_maxIndex : block- signal ~SYM[1] : ~TYP[1];-begin- ~RESULT <= ~SYM[1]'high;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vreplace_integer"- , "templateD" :-"~SYM[0]_vreplace_integer : block- signal ~SYM[1] : ~TYP[1];- signal ~SYM[2] : ~TYP[2];- signal ~SYM[3] : ~TYP[3];-begin- ~SYM[1] <= ~ARG[1];- ~SYM[2] <= ~ARG[2];- ~SYM[3] <= ~ARG[3];- process(~SYM[1],~SYM[2],~SYM[3])- variable ~SYM[4] : ~TYP[1];- begin- ~SYM[4] := ~SYM[1];- -- pragma translate_off- if ~SYM[2] < ~SYM[4]'low or ~SYM[2] > ~SYM[4]'high then- assert false report (\"Index: \" & integer'image(~SYM[2]) & \", is out of bounds: \" & integer'image(~SYM[1]'low) & \" downto \" & integer'image(~SYM[1]'high)) severity warning;- ~SYM[4] := ~ERROR[1];- else- -- pragma translate_on- ~SYM[4](~SYM[2]) := ~SYM[3];- -- pragma translate_off- end if;- -- pragma translate_on- ~RESULT <= ~SYM[4];- end process;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vtake"- , "templateD" :-"~SYM[0]_vtake : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~RESULT <= ~SYM[1](~SYM[1]'high downto (~SYM[1]'length - ~LIT[0]));-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vdrop"- , "templateD" :-"~SYM[0]_vdrop : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~RESULT <= ~SYM[1]((~SYM[1]'high - ~LIT[0]) downto 0);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vexact"- , "templateD" :-"~SYM[0]_vexact : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~RESULT <= ~SYM[1](~LIT[0]);-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vselect"- , "comment" :- "vselect :: ((f + (s * n) + 1) <= i) -- ARG[0]- => SNat f -- ARG[1]- -> SNat s -- ARG[2]- -> SNat (n + 1) -- ARG[3]- -> Vec i a -- ARG[4]- -> Vec (n + 1) a"- , "templateD" :-"~SYM[0]_vselect : block- signal ~SYM[1] : ~TYP[4];-begin- ~SYM[1] <= ~ARG[4];- ~SYM[2]_vselect : for ~SYM[3] in 0 to ~RESULT'high generate- begin- ~RESULT(~RESULT'high - ~SYM[3]) <= ~SYM[1](~SYM[1]'high - (~LIT[1]+(~LIT[2]*~SYM[3])));- end generate;-end block;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vcopy"- , "templateE" : "~TYPMO'((~LIT[0] - 1) downto 0 => ~ARG[1])"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.viterate"- , "templateD" :-"~SYM[0]_viterate : for ~SYM[1] in ~RESULT'high downto 0 generate-begin- ~SYM[2]_generate : if ~SYM[1] = (~RESULT'high) generate- begin- ~RESULT(~SYM[1]) <= ~ARG[2];- end generate;-- ~SYM[3]_generate : if ~SYM[1] /= (~RESULT'high) generate- begin- ~INST 0- ~OUTPUT <= ~RESULT(~SYM[1])~ ~TYPEL[~TYPO]~- ~INPUT <= ~RESULT(~SYM[1]+1)~ ~TYPEL[~TYPO]~- ~INST- end generate;-end generate;"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.lazyV"- , "templateE" : "~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Sized.Vector.vhead'"- , "templateD" :-"~SYM[0]_vhead : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[1];- ~RESULT <= ~SYM[1](~SYM[1]'high);-end block;"- }- }-]
− primitives/control.exception.base.json
@@ -1,16 +0,0 @@-[ { "BlackBox" :- { "name" : "Control.Exception.Base.patError"- , "templateE" : "~ERRORO"- }- }-, { "BlackBox" :- { "name" : "Control.Exception.Base.irrefutPatError"- , "templateE" : "~ERRORO"- }- }-, { "BlackBox" :- { "name" : "Control.Exception.Base.recSelError"- , "templateE" : "~ERRORO"- }- }-]
− primitives/ghc.base.json
@@ -1,33 +0,0 @@-[ { "Primitive" :- { "name" : "GHC.Base.$"- , "primType" : "Function"- }- }-, { "BlackBox" :- { "name" : "GHC.Base.quotInt"- , "templateE" : "~ARG[0] div ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Base.remInt"- , "templateE" : "~ARG[0] rem ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Base.divInt"- , "templateD" :-"~SYM[0]_block : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[0] / ~ARG[1];- ~RESULT <= ~SYM[1] - 1 when ((~ARG[0] = abs ~ARG[0]) /= (~ARG[1] = abs ~ARG[1])) else- ~SYM[1];-end block;"- }- }-, { "BlackBox" :- { "name" : "GHC.Base.modInt"- , "templateE" : "~ARG[0] mod ~ARG[1]"- }- }-]
− primitives/ghc.classes.json
@@ -1,63 +0,0 @@-[ { "BlackBox" :- { "name" : "GHC.Classes.eqInt"- , "templateE" : "~ARG[0] = ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.neInt"- , "templateE" : "~ARG[0] /= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.gtInt"- , "templateE" : "~ARG[0] > ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.geInt"- , "templateE" : "~ARG[0] >= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.ltInt"- , "templateE" : "~ARG[0] < ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.leInt"- , "templateE" : "~ARG[0] <= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.&&"- , "templateE" : "~ARG[0] and ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.||"- , "templateE" : "~ARG[0] or ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.not"- , "templateE" : "not ~ARG[0]"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.divInt#"- , "templateD" :-"~SYM[0]_block : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[0] / ~ARG[1];- ~RESULT <= ~SYM[1] - 1 when ((~ARG[0] = abs ~ARG[0]) /= (~ARG[1] = abs ~ARG[1])) else- ~SYM[1];-end block;"- }- }-, { "BlackBox" :- { "name" : "GHC.Classes.modInt#"- , "templateE" : "~ARG[0] mod ~ARG[1]"- }- }-]
− primitives/ghc.cstring.json
@@ -1,11 +0,0 @@-[ { "Primitive" :- { "name" : "GHC.CString.unpackCString#"- , "primType" : "Function"- }- }-, { "Primitive" :- { "name" : "GHC.CString.unpackCStringUtf8#"- , "primType" : "Function"- }- }-]
− primitives/ghc.err.json
@@ -1,11 +0,0 @@-[ { "BlackBox" :- { "name" : "GHC.Err.error"- , "templateE" : "~ERRORO"- }- }-, { "BlackBox" :- { "name" : "GHC.Err.undefined"- , "templateE" : "~ERRORO"- }- }-]
− primitives/ghc.integer.type.json
@@ -1,123 +0,0 @@-[ { "BlackBox" :- { "name" : "GHC.Integer.Type.smallInteger"- , "templateE" : "~ARG[0]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.integerToInt"- , "templateE" : "~ARG[0]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.plusInteger"- , "templateE" : "~ARG[0] + ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.minusInteger"- , "templateE" : "~ARG[0] - ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.timesInteger"- , "templateE" : "~ARG[0] * ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.negateInteger"- , "templateE" : "-~ARG[0]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.absInteger"- , "templateE" : "abs ~ARG[0]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.divInteger"- , "templateD" :-"~SYM[0]_block : block- signal ~SYM[1] : ~TYP[1];-begin- ~SYM[1] <= ~ARG[0] / ~ARG[1];- ~RESULT <= ~SYM[1] - 1 when ((~ARG[0] = abs ~ARG[0]) /= (~ARG[1] = abs ~ARG[1])) else- ~SYM[1];-end block;"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.modInteger"- , "templateE" : "~ARG[0] mod ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.quotInteger"- , "templateE" : "~ARG[0] div ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.remInteger"- , "templateE" : "~ARG[0] rem ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.eqInteger"- , "templateE" : "~ARG[0] = ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.neqInteger"- , "templateE" : "~ARG[0] /= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.leInteger"- , "templateE" : "~ARG[0] <= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.gtInteger"- , "templateE" : "~ARG[0] > ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.ltInteger"- , "templateE" : "~ARG[0] < ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.geInteger"- , "templateE" : "~ARG[0] >= ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.eqInteger#"- , "templateE" : "1 when ~ARG[0] = ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.neqInteger#"- , "templateE" : "1 when ~ARG[0] /= ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.leInteger#"- , "templateE" : "1 when ~ARG[0] <= ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.gtInteger#"- , "templateE" : "1 when ~ARG[0] > ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.ltInteger#"- , "templateE" : "1 when ~ARG[0] < ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Integer.Type.geInteger#"- , "templateE" : "1 when ~ARG[0] >= ~ARG[1] else 0"- }- }-]
− primitives/ghc.prim.json
@@ -1,76 +0,0 @@-[ { "BlackBox" :- { "name" : "GHC.Prim.+#"- , "templateE" : "~ARG[0] + ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.-#"- , "templateE" : "~ARG[0] - ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.*#"- , "templateE" : "~ARG[0] * ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.quotInt#"- , "templateE" : "~ARG[0] div ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.remInt#"- , "templateE" : "~ARG[0] rem ~ARG[1]"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.negateInt#"- , "templateE" : "-~ARG[0]"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.>#"- , "templateE" : "1 when ~ARG[0] > ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.>=#"- , "templateE" : "1 when ~ARG[0] >= ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.==#"- , "templateE" : "1 when ~ARG[0] = ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim./=#"- , "templateE" : "1 when ~ARG[0] /= ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.<#"- , "templateE" : "1 when ~ARG[0] < ~ARG[1] else 0"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.<=#"- , "templateE" : "1 when ~ARG[0] <= ~ARG[1] else 0"- }- }-, { "Primitive" :- { "name" : "GHC.Prim.dataToTag#"- , "primType" : "Function"- }- }-, { "Primitive" :- { "name" : "GHC.Prim.tagToEnum#"- , "primType" : "Function"- }- }-, { "BlackBox" :- { "name" : "GHC.Prim.unsafeCoerce#"- , "templateE" : "~ARG[0]"- }- }-]
− primitives/ghc.real.json
@@ -1,16 +0,0 @@-[ { "BlackBox" :- { "name" : "GHC.Real.divZeroError"- , "templateE" : "~ERRORO"- }- }-, { "BlackBox" :- { "name" : "GHC.Real.ratioZeroDenominatorError"- , "templateE" : "~ERRORO"- }- }-, { "BlackBox" :- { "name" : "GHC.Real.overflowError"- , "templateE" : "~ERRORO"- }- }-]
− primitives/ghc.typelits.json
@@ -1,6 +0,0 @@-[ { "BlackBox" :- { "name" : "GHC.TypeLits.natVal"- , "templateE" : "~LIT[0]"- }- }-]
− primitives/ghc.types.json
@@ -1,11 +0,0 @@-[ { "Primitive" :- { "name" : "GHC.Types.Eq#"- , "primType" : "Constructor"- }- }-, { "Primitive" :- { "name" : "GHC.Types.MkCoercible"- , "primType" : "Constructor"- }- }-]
− primitives/unsafe.coerce.json
@@ -1,6 +0,0 @@-[ { "BlackBox" :- { "name" : "Unsafe.Coerce.unsafeCoerce"- , "templateE" : "~ARG[0]"- }- }-]
src-bin/InteractiveUI.hs view
@@ -1496,21 +1496,24 @@ makeVHDL :: [FilePath] -> InputT GHCi () makeVHDL [] = do modGraph <- GHC.getModuleGraph+ dflags <- getDynFlags let sortedGraph = GHC.topSortModuleGraph False modGraph Nothing case (reverse sortedGraph) of (AcyclicSCC top):_ -> do let loc = (GHC.ml_hs_file . GHC.ms_location) top maybe (return ()) (\src -> liftIO $ do primDir <- getDefPrimDir primMap <- CLaSH.Primitives.Util.generatePrimMap [primDir,"."]- (bindingsMap,tcm) <- generateBindings primMap src+ (bindingsMap,tcm) <- generateBindings primMap src (Just dflags) CLaSH.Driver.generateVHDL bindingsMap primMap tcm ghcTypeToHWType reduceConstant DebugNone ) loc _ -> return ()-makeVHDL srcs = liftIO $ do primDir <- getDefPrimDir- primMap <- CLaSH.Primitives.Util.generatePrimMap [primDir,"."]- mapM_ (\src -> do (bindingsMap,tcm) <- generateBindings primMap src- CLaSH.Driver.generateVHDL bindingsMap primMap tcm ghcTypeToHWType reduceConstant DebugNone- ) srcs+makeVHDL srcs = do+ dflags <- getDynFlags+ liftIO $ do primDir <- getDefPrimDir+ primMap <- CLaSH.Primitives.Util.generatePrimMap [primDir,"."]+ mapM_ (\src -> do (bindingsMap,tcm) <- generateBindings primMap src (Just dflags)+ CLaSH.Driver.generateVHDL bindingsMap primMap tcm ghcTypeToHWType reduceConstant DebugNone+ ) srcs ----------------------------------------------------------------------------- -- :type@@ -1890,10 +1893,9 @@ -- the actual exception thrown by checkAdd, using tryBool to -- turn it into a Bool. iidecls <- filterM (tryBool.checkAdd) (transient_ctx st ++ remembered_ctx st)- dflags <- GHC.getSessionDynFlags GHC.setContext $- if xopt Opt_ImplicitPrelude dflags && not (any isPreludeImport iidecls)- then iidecls ++ [implicitPreludeImport,implicitCLaSHPreludeImport]+ if not (any isPreludeImport iidecls)+ then iidecls ++ [implicitPreludeImport] else iidecls -- XXX put prel at the end, so that guessCurrentModule doesn't pick it up. @@ -1915,17 +1917,11 @@ iiModuleName (IIDecl d) = unLoc (ideclName d) preludeModuleName :: ModuleName-preludeModuleName = GHC.mkModuleName "Prelude"--clashPreludeModuleName :: ModuleName-clashPreludeModuleName = GHC.mkModuleName "CLaSH.Prelude"+preludeModuleName = GHC.mkModuleName "CLaSH.Prelude" implicitPreludeImport :: InteractiveImport implicitPreludeImport = IIDecl (simpleImportDecl preludeModuleName) -implicitCLaSHPreludeImport :: InteractiveImport-implicitCLaSHPreludeImport = IIDecl (simpleImportDecl clashPreludeModuleName)- isPreludeImport :: InteractiveImport -> Bool isPreludeImport (IIModule {}) = True isPreludeImport (IIDecl d) = unLoc (ideclName d) == preludeModuleName@@ -2283,8 +2279,7 @@ prel_imp | any isPreludeImport (rem_ctx ++ trans_ctx) = []- | not (xopt Opt_ImplicitPrelude dflags) = []- | otherwise = ["import Prelude -- implicit"]+ | otherwise = ["import CLaSH.Prelude -- implicit"] trans_comment s = s ++ " -- added automatically" --
src-bin/Main.hs view
@@ -175,6 +175,10 @@ , DynFlags.Opt_ConstraintKinds , DynFlags.Opt_TypeFamilies ]+ dflagsExtra' = foldl DynFlags.xopt_unset dflagsExtra+ [ DynFlags.Opt_ImplicitPrelude+ , DynFlags.Opt_MonomorphismRestriction+ ] case postStartupMode of Left preLoadMode ->@@ -185,7 +189,7 @@ ShowGhciUsage -> showGhciUsage dflags PrintWithDynFlags f -> putStrLn (f dflags) Right postLoadMode ->- main' postLoadMode dflagsExtra argv3 flagWarnings+ main' postLoadMode dflagsExtra' argv3 flagWarnings main' :: PostLoadMode -> DynFlags -> [Located String] -> [Located String] -> Ghc ()@@ -895,11 +899,13 @@ doVHDL :: [(String,Maybe Phase)] -> Ghc () doVHDL [] = throwGhcException (CmdLineError "No input files")-doVHDL srcs = liftIO $ do primDir <- getDefPrimDir- primMap <- CLaSH.Primitives.Util.generatePrimMap [primDir,"."]- mapM_ (\(src,_) -> do (bindingsMap,tcm) <- generateBindings primMap src- CLaSH.Driver.generateVHDL bindingsMap primMap tcm ghcTypeToHWType reduceConstant DebugNone- ) srcs+doVHDL srcs = do+ dflags <- GHC.getSessionDynFlags+ liftIO $ do primDir <- getDefPrimDir+ primMap <- CLaSH.Primitives.Util.generatePrimMap [primDir,"."]+ mapM_ (\(src,_) -> do (bindingsMap,tcm) <- generateBindings primMap src (Just dflags)+ CLaSH.Driver.generateVHDL bindingsMap primMap tcm ghcTypeToHWType reduceConstant DebugNone+ ) srcs -- ----------------------------------------------------------------------------- -- Util
src-ghc/CLaSH/GHC/Evaluator.hs view
@@ -1,37 +1,60 @@ {-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE OverloadedStrings #-} module CLaSH.GHC.Evaluator where import qualified Data.Bifunctor as Bifunctor+import Data.Bits (shiftL,shiftR) import qualified Data.Either as Either import qualified Data.HashMap.Strict as HashMap import qualified Data.List as List-import qualified Data.Text as Text+import Unbound.LocallyNameless (bind, embed, string2Name)+ import CLaSH.Core.DataCon (dcTag) import CLaSH.Core.Literal (Literal (..)) import CLaSH.Core.Term (Term (..))-import CLaSH.Core.Type (Type (..), ConstTy (..))+import CLaSH.Core.Type (Type (..), ConstTy (..), mkFunTy) import CLaSH.Core.TyCon (TyCon, TyConName, tyConDataCons)-import CLaSH.Core.Util (collectArgs)+import CLaSH.Core.TysPrim (typeNatKind)+import CLaSH.Core.Util (collectArgs, mkApps)+import CLaSH.Core.Var (Var (..)) reduceConstant :: HashMap.HashMap TyConName TyCon -> Term -> Term reduceConstant tcm e@(collectArgs -> (Prim nm _, args))- | nm == Text.pack "GHC.Integer.Type.eqInteger#"+ | nm == "GHC.Prim.==#" || nm == "GHC.Integer.Type.eqInteger#" = case (map (reduceConstant tcm) . Either.lefts) args of [Literal (IntegerLiteral i), Literal (IntegerLiteral j)] | i == j -> Literal (IntegerLiteral 1) | otherwise -> Literal (IntegerLiteral 0) _ -> e- | nm == Text.pack "GHC.Prim.<=#" || nm == Text.pack "GHC.Integer.Type.leInteger#"+ | nm == "GHC.Integer.Type.gtInteger#" = case (map (reduceConstant tcm) . Either.lefts) args of [Literal (IntegerLiteral i), Literal (IntegerLiteral j)]+ | i > j -> Literal (IntegerLiteral 1)+ | otherwise -> Literal (IntegerLiteral 0)+ _ -> e+ | nm == "GHC.Integer.Type.ltInteger#"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), Literal (IntegerLiteral j)]+ | i < j -> Literal (IntegerLiteral 1)+ | otherwise -> Literal (IntegerLiteral 0)+ _ -> e+ | nm == "GHC.Prim.<=#" || nm == "GHC.Integer.Type.leInteger#"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), Literal (IntegerLiteral j)] | i <= j -> Literal (IntegerLiteral 1) | otherwise -> Literal (IntegerLiteral 0) _ -> e- | nm == Text.pack "GHC.Integer.Type.integerToInt"+ | nm == "GHC.Prim.>=#" || nm == "GHC.Integer.Type.geInteger#" = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), Literal (IntegerLiteral j)]+ | i >= j -> Literal (IntegerLiteral 1)+ | otherwise -> Literal (IntegerLiteral 0)+ _ -> e+ | nm == "GHC.Integer.Type.integerToInt"+ = case (map (reduceConstant tcm) . Either.lefts) args of [Literal (IntegerLiteral i)] -> Literal (IntegerLiteral i) _ -> e- | nm == Text.pack "GHC.Prim.tagToEnum#"+ | nm == "GHC.Prim.tagToEnum#" = case map (Bifunctor.bimap (reduceConstant tcm) id) args of [Right (ConstTy (TyCon tcN)), Left (Literal (IntegerLiteral i))] -> let dc = do { tc <- HashMap.lookup tcN tcm@@ -40,5 +63,81 @@ } in maybe e Data dc _ -> e+ | nm == "GHC.Prim.*#"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), Literal (IntegerLiteral j)]+ -> Literal (IntegerLiteral (i * j))+ _ -> e+ | nm == "GHC.Integer.Type.divInteger"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), Literal (IntegerLiteral j)]+ -> Literal (IntegerLiteral (i `div` j))+ _ -> e+ | nm == "GHC.Integer.Type.shiftLInteger"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), Literal (IntegerLiteral j)]+ -> Literal (IntegerLiteral (i `shiftL` fromInteger j))+ _ -> e+ | nm == "GHC.Integer.Type.shiftRInteger"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), Literal (IntegerLiteral j)]+ -> Literal (IntegerLiteral (i `shiftR` fromInteger j))+ _ -> e+ | nm == "GHC.Prim.negateInt#"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i)] -> Literal (IntegerLiteral (negate i))+ _ -> e+ | nm == "CLaSH.Sized.Internal.Signed.minBound#"+ = case args of+ [litTy,Left (Literal (IntegerLiteral mb))]+ -> let minB = negate (2 ^ (mb - 1))+ in mkApps signedConPrim [litTy,Left (Literal (IntegerLiteral minB))]+ _ -> e+ | nm == "CLaSH.Sized.Internal.Signed.maxBound#"+ = case args of+ [litTy,Left (Literal (IntegerLiteral mb))]+ -> let maxB = (2 ^ (mb - 1)) - 1+ in mkApps signedConPrim [litTy,Left (Literal (IntegerLiteral maxB))]+ _ -> e+ | nm == "CLaSH.Sized.Internal.Unsigned.minBound#"+ = case args of+ [litTy]+ -> mkApps unsignedConPrim [litTy,Left (Literal (IntegerLiteral 0))]+ _ -> e+ | nm == "CLaSH.Sized.Internal.Unsigned.maxBound#"+ = case args of+ [litTy,Left (Literal (IntegerLiteral mb))]+ -> let maxB = 2 ^ mb+ in mkApps unsignedConPrim [litTy,Left (Literal (IntegerLiteral maxB))]+ _ -> e+ | nm == "CLaSH.Sized.Internal.Signed.toInteger#" || nm == "CLaSH.Sized.Internal.Unsigned.toInteger#"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [App _ (Literal (IntegerLiteral i))]+ -> Literal (IntegerLiteral i)+ _ -> e+ | nm == "GHC.TypeLits.natVal"+ = case (map (reduceConstant tcm) . Either.lefts) args of+ [Literal (IntegerLiteral i), _] -> Literal (IntegerLiteral i)+ _ -> e reduceConstant _ e = e++signedConPrim :: Term+signedConPrim = Prim "CLaSH.Sized.Internal.Signed.S" (ForAllTy (bind nTV funTy))+ where+ funTy = mkFunTy intTy (AppTy signedTy nVar)+ intTy = ConstTy (TyCon (string2Name "GHC.Integer.Type.Integer"))+ signedTy = ConstTy (TyCon (string2Name "CLaSH.Sized.Internal.Signed.Signed"))+ nName = string2Name "n"+ nVar = VarTy typeNatKind nName+ nTV = TyVar nName (embed typeNatKind)++unsignedConPrim :: Term+unsignedConPrim = Prim "CLaSH.Sized.Internal.Unsigned.U" (ForAllTy (bind nTV funTy))+ where+ funTy = mkFunTy intTy (AppTy unsignedTy nVar)+ intTy = ConstTy (TyCon (string2Name "GHC.Integer.Type.Integer"))+ unsignedTy = ConstTy (TyCon (string2Name "CLaSH.Sized.Internal.Unsigned.Unsigned"))+ nName = string2Name "n"+ nVar = VarTy typeNatKind nName+ nTV = TyVar nName (embed typeNatKind)
src-ghc/CLaSH/GHC/GHC2Core.hs view
@@ -275,15 +275,13 @@ Nothing -> C.Data <$> coreToDataCon (isDataConWrapId x && not (isNewTyCon (dataConTyCon dc))) dc Nothing -> case HashMap.lookup xNameS primMap of Just (Primitive f _)- | f == pack "CLaSH.Signal.Types.mapSignal" -> return (mapSyncTerm xType)- | f == pack "CLaSH.Signal.Types.appSignal" -> return (mapSyncTerm xType)- | f == pack "CLaSH.Signal.Types.signal" -> return (syncTerm xType)- | f == pack "CLaSH.Signal.Implicit.pack" -> return (splitCombineTerm False xType)- | f == pack "CLaSH.Signal.Implicit.unpack" -> return (splitCombineTerm True xType)- | f == pack "CLaSH.Signal.Explicit.cpack" -> return (cpackCUnpackTerm False xType)- | f == pack "CLaSH.Signal.Explicit.cunpack" -> return (cpackCUnpackTerm True xType)- | f == pack "GHC.Base.$" -> return (dollarAppTerm xType)- | otherwise -> return (C.Prim xNameS xType)+ | f == pack "CLaSH.Signal.Internal.mapSignal#" -> return (mapSignalTerm xType)+ | f == pack "CLaSH.Signal.Internal.signal#" -> return (signalTerm xType)+ | f == pack "CLaSH.Signal.Internal.appSignal#" -> return (appSignalTerm xType)+ | f == pack "CLaSH.Signal.Internal.traverse#" -> return (traverseTerm xType)+ | f == pack "CLaSH.Signal.Bundle.vecBundle#" -> return (vecUnwrapTerm xType)+ | f == pack "GHC.Base.$" -> return (dollarTerm xType)+ | otherwise -> return (C.Prim xNameS xType) Just (BlackBox {}) -> return (C.Prim xNameS xType) Nothing@@ -420,84 +418,217 @@ let moduleNm = moduleName module_ return (moduleNameString moduleNm) -mapSyncTerm :: C.Type- -> C.Term-mapSyncTerm (C.ForAllTy tvATy) =- let (aTV,bTV,C.tyView -> C.FunTy _ (C.tyView -> C.FunTy aTy bTy)) = runFreshM $ do- { (aTV',C.ForAllTy tvBTy) <- unbind tvATy- ; (bTV',funTy) <- unbind tvBTy- ; return (aTV',bTV',funTy) }- fName = string2Name "f"- xName = string2Name "x"- fTy = C.mkFunTy aTy bTy- fId = C.Id fName (embed fTy)- xId = C.Id xName (embed aTy)- in C.TyLam $ bind aTV $- C.TyLam $ bind bTV $- C.Lam $ bind fId $- C.Lam $ bind xId $- C.App (C.Var fTy fName) (C.Var aTy xName)+-- | Given the type:+--+-- @forall a. forall b. forall clk. (a -> b) -> CSignal clk a -> CSignal clk b@+--+-- Generate the term:+--+-- @+-- /\(a:*)./\(b:*)./\(clk:Clock).\(f : (CSignal clk a -> CSignal clk b)).+-- \(x : CSignal clk a).f x+-- @+mapSignalTerm :: C.Type+ -> C.Term+mapSignalTerm (C.ForAllTy tvATy) =+ C.TyLam (bind aTV (+ C.TyLam (bind bTV (+ C.TyLam (bind clkTV (+ C.Lam (bind fId (+ C.Lam (bind xId (+ C.App (C.Var fTy fName) (C.Var aTy xName)))))))))))+ where+ (aTV,bTV,clkTV,funTy) = runFreshM $ do+ { (aTV',C.ForAllTy tvBTy) <- unbind tvATy+ ; (bTV',C.ForAllTy tvClkTy) <- unbind tvBTy+ ; (clkTV',funTy') <- unbind tvClkTy+ ; return (aTV',bTV',clkTV',funTy')+ }+ (C.FunTy _ funTy'') = C.tyView funTy+ (C.FunTy aTy bTy) = C.tyView funTy''+ fName = string2Name "f"+ xName = string2Name "x"+ fTy = C.mkFunTy aTy bTy+ fId = C.Id fName (embed fTy)+ xId = C.Id xName (embed aTy) -mapSyncTerm ty = error $ $(curLoc) ++ show ty+mapSignalTerm ty = error $ $(curLoc) ++ show ty -syncTerm :: C.Type- -> C.Term-syncTerm (C.ForAllTy tvTy) =- let (aTV,C.tyView -> C.FunTy _ aTy) = runFreshM $ unbind tvTy- xName = string2Name "x"- xId = C.Id xName (embed aTy)- in C.TyLam $ bind aTV $- C.Lam $ bind xId $- C.Var aTy xName+-- | Given the type:+--+-- @forall a. forall clk. a -> CSignal clk a@+--+-- Generate the term+--+-- @/\(a:*)./\(clk:Clock).\(x:CSignal clk a).x@+signalTerm :: C.Type+ -> C.Term+signalTerm (C.ForAllTy tvATy) =+ C.TyLam (bind aTV (+ C.TyLam (bind clkTV (+ C.Lam (bind xId (+ C.Var aTy xName))))))+ where+ (aTV,clkTV,funTy) = runFreshM $ do+ { (aTV', C.ForAllTy tvClkTy) <- unbind tvATy+ ; (clkTV', funTy') <- unbind tvClkTy+ ; return (aTV',clkTV',funTy')+ }+ (C.FunTy _ aTy) = C.tyView funTy+ xName = string2Name "x"+ xId = C.Id xName (embed aTy) -syncTerm ty = error $ $(curLoc) ++ show ty+signalTerm ty = error $ $(curLoc) ++ show ty -splitCombineTerm :: Bool- -> C.Type- -> C.Term-splitCombineTerm b (C.ForAllTy tvTy) =- let (aTV,C.tyView -> C.FunTy dictTy (C.tyView -> C.FunTy inpTy outpTy)) = runFreshM $ unbind tvTy- dictName = string2Name "splitCombineDict"- xName = string2Name "x"- nTy = if b then inpTy else outpTy- dId = C.Id dictName (embed dictTy)- xId = C.Id xName (embed nTy)- newExpr = C.TyLam $ bind aTV $- C.Lam $ bind dId $- C.Lam $ bind xId $- C.Var nTy xName- in newExpr+-- | Given the type:+--+-- @+-- forall clk. forall a. forall b. CSignal clk (a -> b) -> CSignal clk a ->+-- CSignal clk b+-- @+--+-- Generate the term:+--+-- @+-- /\(clk:Clock)./\(a:*)./\(b:*).\(f : (CSignal clk a -> CSignal clk b)).+-- \(x : CSignal clk a).f x+-- @+appSignalTerm :: C.Type+ -> C.Term+appSignalTerm (C.ForAllTy tvClkTy) =+ C.TyLam (bind clkTV (+ C.TyLam (bind aTV (+ C.TyLam (bind bTV (+ C.Lam (bind fId (+ C.Lam (bind xId (+ C.App (C.Var fTy fName) (C.Var aTy xName)))))))))))+ where+ (clkTV,aTV,bTV,funTy) = runFreshM $ do+ { (clkTV',C.ForAllTy tvATy) <- unbind tvClkTy+ ; (aTV',C.ForAllTy tvBTy) <- unbind tvATy+ ; (bTV',funTy') <- unbind tvBTy+ ; return (clkTV',aTV',bTV',funTy')+ }+ (C.FunTy _ funTy'') = C.tyView funTy+ (C.FunTy aTy bTy) = C.tyView funTy''+ fName = string2Name "f"+ xName = string2Name "x"+ fTy = C.mkFunTy aTy bTy+ fId = C.Id fName (embed fTy)+ xId = C.Id xName (embed aTy) -splitCombineTerm _ ty = error $ $(curLoc) ++ show ty+appSignalTerm ty = error $ $(curLoc) ++ show ty -cpackCUnpackTerm :: Bool- -> C.Type- -> C.Term-cpackCUnpackTerm b (C.ForAllTy tvTy) = newExpr+-- | Given the type:+--+-- @+-- forall t.forall n.forall a.SClock t -> Vec n (CSignal t a) ->+-- CSignal t (Vec n a)+-- @+--+-- Generate the term:+--+-- @+-- /\(t:Clock)./\(n:Nat)./\(a:*).\(sclk:SClock t).\(vs:CSignal (Vec n a)).vs+-- @+vecUnwrapTerm :: C.Type+ -> C.Term+vecUnwrapTerm (C.ForAllTy tvTTy) =+ C.TyLam (bind tTV (+ C.TyLam (bind nTV (+ C.TyLam (bind aTV (+ C.Lam (bind sclkId (+ C.Lam (bind vsId (+ C.Var vsTy vsName)))))))))) where- (aTV,packCDict,clkTV,clkTy,inpTy,outpTy) = runFreshM $ do- (aTV',C.tyView -> C.FunTy packCDict' (C.ForAllTy ty2)) <- unbind tvTy- (clkTV',C.tyView -> (C.FunTy clkTy' (C.tyView -> C.FunTy inpTy' outpTy'))) <- unbind ty2- return (aTV',packCDict',clkTV',clkTy',inpTy',outpTy')- dictName = string2Name "cpackDict"- clkName = string2Name "clk"- sigName = string2Name "csig"- sigTy = if b then inpTy else outpTy- dictId = C.Id dictName (embed packCDict)- clkId = C.Id clkName (embed clkTy)- sigId = C.Id sigName (embed sigTy)- newExpr = C.TyLam $ bind aTV $- C.Lam $ bind dictId $- C.TyLam $ bind clkTV $- C.Lam $ bind clkId $- C.Lam $ bind sigId $- C.Var sigTy sigName+ (tTV,nTV,aTV,funTy) = runFreshM $ do+ { (tTV',C.ForAllTy tvNTy) <- unbind tvTTy+ ; (nTV',C.ForAllTy tvATy) <- unbind tvNTy+ ; (aTV',funTy') <- unbind tvATy+ ; return (tTV',nTV',aTV',funTy')+ }+ (C.FunTy sclkTy funTy'') = C.tyView funTy+ (C.FunTy _ vsTy) = C.tyView funTy''+ sclkName = string2Name "sclk"+ vsName = string2Name "vs"+ sclkId = C.Id sclkName (embed sclkTy)+ vsId = C.Id vsName (embed vsTy) -cpackCUnpackTerm _ ty = error $ $(curLoc) ++ show ty+vecUnwrapTerm ty = error $ $(curLoc) ++ show ty -dollarAppTerm :: C.Type- -> C.Term-dollarAppTerm = mapSyncTerm+-- | Given the type:+--+-- @+-- forall f.forall a.forall b.forall clk.Applicative f => (a -> f b) ->+-- CSignal clk a -> f (CSignal clk b)+-- @+--+-- Generate the term:+--+-- @+-- /\(f:* -> *)./\(a:*)./\(b:*)./\(clk:Clock).\(dict:Applicative f).+-- \(g:a -> f b).\(x:CSignal clk a).g x+-- @+traverseTerm :: C.Type+ -> C.Term+traverseTerm (C.ForAllTy tvFTy) =+ C.TyLam (bind fTV (+ C.TyLam (bind aTV (+ C.TyLam (bind bTV (+ C.TyLam (bind clkTV (+ C.Lam (bind dictId (+ C.Lam (bind gId (+ C.Lam (bind xId (+ C.App (C.Var gTy gName) (C.Var xTy xName)))))))))))))))+ where+ (fTV,aTV,bTV,clkTV,funTy) = runFreshM $ do+ { (fTV',C.ForAllTy tvATy) <- unbind tvFTy+ ; (aTV',C.ForAllTy tvBTy) <- unbind tvATy+ ; (bTV',C.ForAllTy tvClkTy) <- unbind tvBTy+ ; (clkTV',funTy') <- unbind tvClkTy+ ; return (fTV',aTV',bTV',clkTV',funTy')+ }+ (C.FunTy dictTy funTy1) = C.tyView funTy+ (C.FunTy gTy funTy2) = C.tyView funTy1+ (C.FunTy xTy _) = C.tyView funTy2+ dictName = string2Name "dict"+ gName = string2Name "g"+ xName = string2Name "x"+ dictId = C.Id dictName (embed dictTy)+ gId = C.Id gName (embed gTy)+ xId = C.Id xName (embed xTy)++traverseTerm ty = error $ $(curLoc) ++ show ty++-- | Given the type:+--+-- @forall a. forall b. (a -> b) -> a -> b@+--+-- Generate the term:+--+-- @/\(a:*)./\(b:*).\(f : (a -> b)).\(x : a).f x@+dollarTerm :: C.Type+ -> C.Term+dollarTerm (C.ForAllTy tvATy) =+ C.TyLam (bind aTV (+ C.TyLam (bind bTV (+ C.Lam (bind fId (+ C.Lam (bind xId (+ C.App (C.Var fTy fName) (C.Var aTy xName)))))))))+ where+ (aTV,bTV,funTy) = runFreshM $ do+ { (aTV',C.ForAllTy tvBTy) <- unbind tvATy+ ; (bTV',funTy') <- unbind tvBTy+ ; return (aTV',bTV',funTy')+ }+ (C.FunTy fTy funTy'') = C.tyView funTy+ (C.FunTy aTy _) = C.tyView funTy''+ fName = string2Name "f"+ xName = string2Name "x"+ fId = C.Id fName (embed fTy)+ xId = C.Id xName (embed aTy)++dollarTerm ty = error $ $(curLoc) ++ show ty isDataConWrapId :: Id -> Bool isDataConWrapId v = case idDetails v of
src-ghc/CLaSH/GHC/GenerateBindings.hs view
@@ -12,6 +12,7 @@ import Unbound.LocallyNameless (name2String, runFreshM, unembed) import qualified CoreSyn as GHC+import qualified DynFlags as GHC import CLaSH.Core.FreeVars (termFreeIds) import CLaSH.Core.Term (Term (..), TmName)@@ -33,9 +34,10 @@ generateBindings :: PrimMap -> String+ -> Maybe (GHC.DynFlags) -> IO (BindingMap,HashMap TyConName TyCon)-generateBindings primMap modName = do- (bindings,clsOps,unlocatable,fiEnvs) <- loadModules modName+generateBindings primMap modName dflagsM = do+ (bindings,clsOps,unlocatable,fiEnvs) <- loadModules modName dflagsM let ((bindingsMap,clsVMap),tcMap) = State.runState (mkBindings primMap bindings clsOps unlocatable) emptyGHC2CoreState tcCache = makeAllTyCons tcMap fiEnvs allTcCache = tysPrimMap `HashMap.union` tcCache
src-ghc/CLaSH/GHC/LoadModules.hs view
@@ -18,19 +18,17 @@ #endif -- GHC API--- import qualified CorePrep import CLaSH.GHC.Compat.DynFlags (dopt_set, dopt_unset) import CLaSH.GHC.Compat.GHC (defaultErrorHandler) import qualified CoreSyn import DynFlags (GeneralFlag (..)) import qualified DynFlags import qualified GHC--- import qualified HscMain+import qualified HscMain import qualified HscTypes import qualified MonadUtils import qualified Panic import qualified TidyPgm--- import qualified TyCons import qualified TcRnMonad import qualified TcRnTypes@@ -66,35 +64,44 @@ loadModules :: String+ -> Maybe (DynFlags.DynFlags) -> IO ( [(CoreSyn.CoreBndr, CoreSyn.CoreExpr)] -- Binders , [(CoreSyn.CoreBndr,Int)] -- Class operations , [CoreSyn.CoreBndr] -- Unlocatable Expressions , FamInstEnv.FamInstEnvs )-loadModules modName = defaultErrorHandler $ do+loadModules modName dflagsM = defaultErrorHandler $ do libDir <- MonadUtils.liftIO ghcLibDir GHC.runGhc (Just libDir) $ do- dflags <- GHC.getSessionDynFlags+ dflags <- case dflagsM of+ Just df -> return df+ Nothing -> do+ df <- GHC.getSessionDynFlags+ let dfEn = foldl DynFlags.xopt_set df+ [ DynFlags.Opt_TemplateHaskell+ , DynFlags.Opt_DataKinds+ , DynFlags.Opt_TypeOperators+ , DynFlags.Opt_FlexibleContexts+ , DynFlags.Opt_ConstraintKinds+ , DynFlags.Opt_TypeFamilies+ ]+ let dfDis = foldl DynFlags.xopt_unset dfEn+ [ DynFlags.Opt_ImplicitPrelude+ , DynFlags.Opt_MonomorphismRestriction+ ]+ return dfDis+ let dflags1 = dflags { DynFlags.ctxtStkDepth = 1000+ , DynFlags.optLevel = 2+ , DynFlags.ghcMode = GHC.CompManager+ , DynFlags.ghcLink = GHC.LinkInMemory+ , DynFlags.hscTarget = DynFlags.defaultObjectTarget+ (DynFlags.targetPlatform dflags)+ }+ let dflags2 = wantedOptimizationFlags dflags1 let ghcDynamic = case lookup "GHC Dynamic" (DynFlags.compilerInfo dflags) of Just "YES" -> True _ -> False- let dflags1 = foldl DynFlags.xopt_set- (dflags- { DynFlags.ctxtStkDepth = 1000- , DynFlags.optLevel = 2- , DynFlags.ghcMode = GHC.CompManager- , DynFlags.ghcLink = GHC.LinkInMemory- } )- [ DynFlags.Opt_TemplateHaskell- , DynFlags.Opt_Arrows- , DynFlags.Opt_DataKinds- , DynFlags.Opt_TypeOperators- , DynFlags.Opt_FlexibleContexts- , DynFlags.Opt_ConstraintKinds- , DynFlags.Opt_TypeFamilies- ]- let dflags2 = wantedOptimizationFlags dflags1 let dflags3 = if ghcDynamic then DynFlags.gopt_set dflags2 DynFlags.Opt_BuildDynamicToo else dflags2 _ <- GHC.setSessionDynFlags dflags3@@ -109,14 +116,9 @@ ; tcMod <- GHC.typecheckModule pMod ; dsMod <- fmap GHC.coreModule $ GHC.desugarModule tcMod ; hsc_env <- GHC.getSession- -- ; simpl_guts <- MonadUtils.liftIO $ HscMain.hscSimplify hsc_env dsMod- ; (tidy_guts,_) <- MonadUtils.liftIO $ TidyPgm.tidyProgram hsc_env dsMod- -- ; let tycons = HscTypes.cg_tycons tidy_guts+ ; simpl_guts <- MonadUtils.liftIO $ HscMain.hscSimplify hsc_env dsMod+ ; (tidy_guts,_) <- MonadUtils.liftIO $ TidyPgm.tidyProgram hsc_env simpl_guts ; let pgm = HscTypes.cg_binds tidy_guts- -- ; let pgm = HscTypes.mg_binds dsMod- -- ; let dataTyCons = filter TyCon.isDataTyCon tycons- -- ; dflags'' <- GHC.getSessionDynFlags- -- ; prepBinders <- MonadUtils.liftIO $ CorePrep.corePrepPgm dflags'' hsc_env pgm dataTyCons ; let modFamInstEnv = TcRnTypes.tcg_fam_inst_env $ fst $ GHC.tm_internals_ tcMod ; return (CoreSyn.flattenBinds pgm,modFamInstEnv) }@@ -153,27 +155,30 @@ wantedOptimizationFlags :: GHC.DynFlags -> GHC.DynFlags wantedOptimizationFlags df = foldl dopt_unset (foldl dopt_set df wanted) unwanted where- wanted = [ Opt_Strictness -- [Wanted?] don't care about strictness- , Opt_CSE -- CSE+ wanted = [ Opt_CSE -- CSE , Opt_FullLaziness -- Floats let-bindings outside enclosing lambdas , Opt_Specialise -- Specialise on types, specialise type-class-overloaded function defined in this module for the types- , Opt_DoLambdaEtaExpansion -- We need eta-expansion anyway, so the more GHC does, the better+ , Opt_DoLambdaEtaExpansion -- transform nested series of lambdas into one with multiple arguments, helps us achieve only top-level lambdas , Opt_CaseMerge -- We want fewer case-statements , Opt_DictsCheap -- Makes dictionaries seem cheap to optimizer: hopefully inline , Opt_SimpleListLiterals -- Avoids 'build' rule , Opt_ExposeAllUnfoldings -- We need all the unfoldings we can get , Opt_ForceRecomp -- Force recompilation: never bad+ , Opt_EnableRewriteRules -- Reduce number of functions+ , Opt_SimplPreInlining -- Inlines simple functions, we only care about the major first-order structure+ , Opt_Strictness -- Strictness analysis helps with dead-code analysis+ , Opt_StaticArgumentTransformation -- Turn on the static argument transformation, which turns a recursive function into a non-recursive one with a local recursive loop.+ , Opt_FloatIn -- Moves let-bindings inwards, although it defeats the normal-form with a single top-level let-binding, it helps with other transformations+ , Opt_DictsStrict -- Hopefully helps remove class method selectors+ , Opt_DmdTxDictSel -- I think demand and strictness are related, strictness helps with dead-code, enable ] - unwanted = [ Opt_FloatIn -- Moves let-bindings inwards: defeats the normal-form with a single top-level let-binding- , Opt_StaticArgumentTransformation -- [Wanted?] Turn on the static argument transformation, which turns a recursive function into a non-recursive one with a local recursive loop.- , Opt_LiberateCase -- Perform unrolling of recursive RHS: avoid+ unwanted = [ Opt_LiberateCase -- Perform unrolling of recursive RHS: avoid , Opt_SpecConstr -- Creates local-functions: avoid , Opt_IgnoreAsserts -- We don't care about assertions , Opt_DoEtaReduction -- We want eta-expansion , Opt_UnboxStrictFields -- Unboxed types are not handled properly: avoid , Opt_UnboxSmallStrictFields -- Unboxed types are not handled properly: avoid- , Opt_EnableRewriteRules -- Intermediate data-structures take up no space , Opt_Vectorise -- Don't care , Opt_VectorisationAvoidance -- Don't care , Opt_RegsGraph -- Don't care@@ -185,6 +190,6 @@ , Opt_OmitYields -- Don't care , Opt_IgnoreInterfacePragmas -- We need all the unfoldings we can get , Opt_OmitInterfacePragmas -- We need all the unfoldings we can get- , Opt_SimplPreInlining -- Does inlining, which destroys function hierarchy: avoid- , Opt_IrrefutableTuples -- Introduce irrefuntPatError: avoid+ , Opt_IrrefutableTuples -- Introduce irrefutPatError: avoid+ , Opt_Loopification -- STG pass, don't care ]
src-ghc/CLaSH/GHC/NetlistTypes.hs view
@@ -5,15 +5,13 @@ where import Data.HashMap.Strict (HashMap,(!))-import Control.Monad (zipWithM) import Control.Monad.Trans.Error (ErrorT(..)) import Unbound.LocallyNameless (name2String) -import CLaSH.Core.Subst (substTys) import CLaSH.Core.Pretty (showDoc) import CLaSH.Core.TyCon (TyCon (..), TyConName)-import CLaSH.Core.Type (LitTy (..), Type (..), TyName, TypeView (..),- tyView)+import CLaSH.Core.Type (LitTy (..), Type (..), TypeView (..),+ findFunSubst, tyView) import CLaSH.Netlist.Util (coreTypeToHWType) import CLaSH.Netlist.Types (HWType(..)) import CLaSH.Util@@ -27,24 +25,42 @@ "GHC.Integer.Type.Integer" -> return Integer "GHC.Prim.Int#" -> return Integer "GHC.Types.Int" -> return Integer- "GHC.Prim.ByteArray#" -> fail $ "Can't translate type: " ++ showDoc ty+ "GHC.Prim.ByteArray#" ->+ fail $ "Can't translate type: " ++ showDoc ty+ "GHC.Types.Bool" -> return Bool- "GHC.Prim.~#" -> fail $ "Can't translate type: " ++ showDoc ty- "CLaSH.Bit.Bit" -> return Bit- "CLaSH.Signal.Implicit.Pack" -> fail $ "Can't translate type: " ++ showDoc ty- "CLaSH.Signal.Implicit.CPack" -> fail $ "Can't translate type: " ++ showDoc ty- "CLaSH.Signal.Types.Signal" -> ErrorT $ return $ coreTypeToHWType ghcTypeToHWType m (head args)- "CLaSH.Signal.Types.CSignal" -> ErrorT $ return $ coreTypeToHWType ghcTypeToHWType m (args !! 1)- "CLaSH.Signal.Implicit.SignalP" -> ErrorT $ return $ coreTypeToHWType ghcTypeToHWType m (head args)- "CLaSH.Signal.Explicit.CSignalP" -> ErrorT $ return $ coreTypeToHWType ghcTypeToHWType m (args !! 1)- "CLaSH.Sized.Signed.Signed" -> Signed <$> tyNatSize m (head args)- "CLaSH.Sized.Unsigned.Unsigned" -> Unsigned <$> tyNatSize m (head args)- "CLaSH.Sized.Vector.Vec" -> do+ "GHC.Prim.~#" ->+ fail $ "Can't translate type: " ++ showDoc ty++ "CLaSH.Signal.Internal.CSignal" ->+ ErrorT $ return $ coreTypeToHWType ghcTypeToHWType m (args !! 1)++ "CLaSH.Sized.Internal.BitVector.BitVector" ->+ BitVector <$> tyNatSize m (head args)++ "CLaSH.Sized.Internal.Index.Index" ->+ Index <$> tyNatSize m (head args)++ "CLaSH.Sized.Internal.Signed.Signed" ->+ Signed <$> tyNatSize m (head args)++ "CLaSH.Sized.Internal.Unsigned.Unsigned" ->+ Unsigned <$> tyNatSize m (head args)++ "CLaSH.Sized.Vector.Vec" -> do let [szTy,elTy] = args sz <- tyNatSize m szTy elHWTy <- ErrorT $ return $ coreTypeToHWType ghcTypeToHWType m elTy return $ Vector sz elHWTy- _ -> ErrorT Nothing+ _ -> case m ! tc of+ -- TODO: Remove this conversion+ -- The current problem is that type-functions are not reduced by the GHC -> Core+ -- transformation process, and so end up here. Once a fix has been found for+ -- this problem remove this dirty hack.+ FunTyCon {tyConSubst = tcSubst} -> case findFunSubst tcSubst args of+ Just ty' -> ErrorT $ return $ coreTypeToHWType ghcTypeToHWType m ty'+ _ -> ErrorT Nothing+ _ -> ErrorT Nothing ghcTypeToHWType _ _ = Nothing @@ -72,33 +88,3 @@ _ -> fail $ $(curLoc) ++ "Can't convert tyNat: " ++ show ty tyNatSize _ t = fail $ $(curLoc) ++ "Can't convert tyNat: " ++ show t---- Given a set of type functions, and list of argument types, get the first--- type function that matches, and return its substituted RHS type.-findFunSubst :: [([Type],Type)] -> [Type] -> Maybe Type-findFunSubst [] _ = Nothing-findFunSubst (tcSubst:rest) args = case funSubsts tcSubst args of- Just ty -> Just ty- Nothing -> findFunSubst rest args---- Given a ([LHS match type], RHS type) representing a type function, and--- a set of applied types. Match LHS with args, and when successful, return--- a substituted RHS-funSubsts :: ([Type],Type) -> [Type] -> Maybe Type-funSubsts (tcSubstLhs,tcSubstRhs) args = do- tySubts <- concat <$> zipWithM funSubst tcSubstLhs args- let tyRhs = substTys tySubts tcSubstRhs- return tyRhs---- Given a LHS matching type, and a RHS to-match type, check if LHS and RHS--- are a match. If they do match, and the LHS is a variable, return a--- substitution-funSubst :: Type -> Type -> Maybe [(TyName,Type)]-funSubst (VarTy _ nmF) ty = Just [(nmF,ty)]-funSubst tyL@(LitTy _) tyR = if tyL == tyR then Just [] else Nothing-funSubst (tyView -> TyConApp tc argTys) (tyView -> TyConApp tc' argTys')- | tc == tc'- = do- tySubts <- zipWithM funSubst argTys argTys'- return (concat tySubts)-funSubst _ _ = Nothing