clash-vhdl 0.6.16 → 0.7
raw patch · 15 files changed
+337/−117 lines, 15 filesdep +hashabledep ~clash-libdep ~clash-preludePVP ok
version bump matches the API change (PVP)
Dependencies added: hashable
Dependency ranges changed: clash-lib, clash-prelude
API changes (from Hackage documentation)
Files
- CHANGELOG.md +5/−1
- LICENSE +2/−1
- clash-vhdl.cabal +12/−9
- primitives/CLaSH.Class.BitPack.json +29/−0
- primitives/CLaSH.Prelude.BlockRam.File.json +9/−9
- primitives/CLaSH.Prelude.BlockRam.json +10/−10
- primitives/CLaSH.Prelude.RAM.json +11/−11
- primitives/CLaSH.Promoted.Nat.json +21/−24
- primitives/CLaSH.Sized.Internal.BitVector.json +8/−8
- primitives/CLaSH.Sized.Internal.Signed.json +6/−6
- primitives/CLaSH.Sized.Internal.Unsigned.json +8/−8
- primitives/CLaSH.Sized.RTree.json +36/−0
- primitives/GHC.CString.json +5/−0
- primitives/GHC.Integer.Logarithms.json +7/−0
- src/CLaSH/Backend/VHDL.hs +168/−30
CHANGELOG.md view
@@ -1,6 +1,10 @@ # Changelog for the [`clash-vhdl`](http://hackage.haskell.org/package/clash-vhdl) package -## 0.6.16+## 0.7 *January 16th 2017*+* New features:+ * Support `clash-prelude` 0.11++## 0.6.16 *August 3rd 2016* * Fixes bugs: * Incorrect primitive for `Integer`s `ltInteger#` and `geInteger#`
LICENSE view
@@ -1,4 +1,5 @@-Copyright (c) 2015, University of Twente+Copyright (c) 2015, University of Twente,+ 2017, QBayLogic All rights reserved. Redistribution and use in source and binary forms, with or without
clash-vhdl.cabal view
@@ -1,5 +1,5 @@ Name: clash-vhdl-Version: 0.6.16+Version: 0.7 Synopsis: CAES Language for Synchronous Hardware - VHDL backend Description: CλaSH (pronounced ‘clash’) is a functional hardware description language that@@ -9,9 +9,8 @@ . Features of CλaSH: .- * Strongly typed (like VHDL), yet with a very high degree of type inference,- enabling both safe and fast prototying using consise descriptions (like- Verilog).+ * Strongly typed, but with a very high degree of type inference, enabling both+ safe and fast prototyping using concise descriptions. . * Interactive REPL: load your designs in an interpreter and easily test all your component without needing to setup a test bench.@@ -34,14 +33,15 @@ License-file: LICENSE Author: Christiaan Baaij Maintainer: Christiaan Baaij <christiaan.baaij@gmail.com>-Copyright: Copyright © 2015-2016 University of Twente+Copyright: Copyright © 2015-2016, University of Twente, 2017, QBayLogic Category: Hardware Build-type: Simple Extra-source-files: README.md, CHANGELOG.md -Data-files: primitives/CLaSH.Driver.TestbenchGen.json+Data-files: primitives/CLaSH.Class.BitPack.json+ primitives/CLaSH.Driver.TestbenchGen.json primitives/CLaSH.Driver.TopWrapper.json primitives/CLaSH.GHC.GHC2Core.json primitives/CLaSH.Prelude.BlockRam.json@@ -60,6 +60,7 @@ primitives/CLaSH.Sized.Internal.Index.json primitives/CLaSH.Sized.Internal.Signed.json primitives/CLaSH.Sized.Internal.Unsigned.json+ primitives/CLaSH.Sized.RTree.json primitives/CLaSH.Sized.Vector.json primitives/CLaSH.Transformations.json primitives/Control.Exception.Base.json@@ -69,6 +70,7 @@ primitives/GHC.CString.json primitives/GHC.Err.json primitives/GHC.Int.json+ primitives/GHC.Integer.Logarithms.json primitives/GHC.Integer.Type.json primitives/GHC.Prim.json primitives/GHC.Real.json@@ -98,10 +100,11 @@ ViewPatterns Build-depends: base >= 4.6.0.1 && < 5,- clash-lib >= 0.6.18 && < 0.7,- clash-prelude >= 0.10.1 && < 0.11,+ clash-lib >= 0.7 && < 0.8,+ clash-prelude >= 0.1 && < 0.12, fgl >= 5.4.2.4 && < 5.6,- lens >= 3.9.2 && < 4.15,+ hashable >= 1.2.1.0 && < 1.3,+ lens >= 3.9.2 && < 4.16, mtl >= 2.1.2 && < 2.3, text >= 0.11.3.1 && < 1.3, unordered-containers >= 0.2.3.3 && < 0.3,
+ primitives/CLaSH.Class.BitPack.json view
@@ -0,0 +1,29 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Class.BitPack.packFloat#"+ , "type" :+"packFloat# :: Float -> BitVector 32"+ , "templateE" : "~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Class.BitPack.unpackFloat#"+ , "type" :+"packFloat# :: BitVector 32 -> Float"+ , "templateE" : "~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Class.BitPack.packDouble#"+ , "type" :+"packFloat# :: Double -> BitVector 64"+ , "templateE" : "~ARG[0]"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Class.BitPack.unpackDouble#"+ , "type" :+"packFloat# :: BitVector 64 -> Double"+ , "templateE" : "~ARG[0]"+ }+ }+]
primitives/CLaSH.Prelude.BlockRam.File.json view
@@ -5,9 +5,9 @@ => SClock clk -- clk, ARG[1] -> SNat n -- sz, ARG[2] -> FilePath -- file, ARG[3]- -> Signal' clk Int -- wr, ARG[4]- -> Signal' clk Int -- rd, ARG[5]- -> Signal' clk Bool -- wren, ARG[6]+ -> Signal' clk Int -- rd, ARG[4]+ -> Signal' clk Bool -- wren, ARG[5]+ -> Signal' clk Int -- wr, ARG[6] -> Signal' clk (BitVector m) -- din, ARG[7] -> Signal' clk (BitVector m)" , "templateD" :@@ -29,8 +29,8 @@ signal ~GENSYM[RAM][2] : ~SYM[6](0 to ~LIT[2]-1) := ~SYM[1](~FILE[~LIT[3]]); signal ~GENSYM[dout][3] : ~TYP[7];- signal ~GENSYM[wr][4] : integer range 0 to ~LIT[2]-1;- signal ~GENSYM[rd][5] : integer range 0 to ~LIT[2]-1;+ signal ~GENSYM[rd][4] : integer range 0 to ~LIT[2]-1;+ signal ~GENSYM[wr][5] : integer range 0 to ~LIT[2]-1; begin ~SYM[4] <= to_integer(~ARG[4]) -- pragma translate_off@@ -38,7 +38,7 @@ -- pragma translate_on ; - ~SYM[5] <= to_integer(~ARG[5])+ ~SYM[5] <= to_integer(~ARG[6]) -- pragma translate_off mod ~LIT[2] -- pragma translate_on@@ -47,10 +47,10 @@ ~GENSYM[blockRamFile_sync][7] : process(~CLK[1]) begin if (rising_edge(~CLK[1])) then- if ~ARG[6] then- ~SYM[2](~SYM[4]) <= to_bitvector(~ARG[7]);+ if ~ARG[5] then+ ~SYM[2](~SYM[5]) <= to_bitvector(~ARG[7]); end if;- ~SYM[3] <= to_stdlogicvector(~SYM[2](~SYM[5]));+ ~SYM[3] <= to_stdlogicvector(~SYM[2](~SYM[4])); end if; end process;
primitives/CLaSH.Prelude.BlockRam.json view
@@ -4,9 +4,9 @@ "blockRam# :: KnownNat n -- ARG[0] => SClock clk -- clk, ARG[1] -> Vec n a -- init, ARG[2]- -> Signal' clk Int -- wr, ARG[3]- -> Signal' clk Int -- rd, ARG[4]- -> Signal' clk Bool -- wren, ARG[5]+ -> Signal' clk Int -- rd, ARG[3]+ -> Signal' clk Bool -- wren, ARG[4]+ -> Signal' clk Int -- wr, ARG[5] -> Signal' clk a -- din, ARG[6] -> Signal' clk a" , "templateD" :@@ -15,8 +15,8 @@ signal ~GENSYM[RAM][1] : ~TYP[2] := ~LIT[2];~IF ~VIVADO ~THEN signal ~GENSYM[dout][2] : std_logic_vector(~SIZE[~TYP[6]]-1 downto 0);~ELSE signal ~SYM[2] : ~TYP[6];~FI- signal ~GENSYM[wr][3] : integer range 0 to ~LIT[0] - 1;- signal ~GENSYM[rd][4] : integer range 0 to ~LIT[0] - 1;+ signal ~GENSYM[rd][3] : integer range 0 to ~LIT[0] - 1;+ signal ~GENSYM[wr][4] : integer range 0 to ~LIT[0] - 1; begin ~SYM[3] <= to_integer(~ARG[3]) -- pragma translate_off@@ -24,7 +24,7 @@ -- pragma translate_on ; - ~SYM[4] <= to_integer(~ARG[4])+ ~SYM[4] <= to_integer(~ARG[5]) -- pragma translate_off mod ~LIT[0] -- pragma translate_on@@ -33,11 +33,11 @@ ~GENSYM[blockRam_sync][5] : process(~CLK[1]) begin if rising_edge(~CLK[1]) then- if ~ARG[5] then~IF ~VIVADO ~THEN- ~SYM[1](~SYM[3]) <= ~TOBV[~ARG[6]][~TYP[6]];~ELSE- ~SYM[1](~SYM[3]) <= ~ARG[6];~FI+ if ~ARG[4] then~IF ~VIVADO ~THEN+ ~SYM[1](~SYM[4]) <= ~TOBV[~ARG[6]][~TYP[6]];~ELSE+ ~SYM[1](~SYM[4]) <= ~ARG[6];~FI end if;- ~SYM[2] <= ~SYM[1](~SYM[4]);+ ~SYM[2] <= ~SYM[1](~SYM[3]); end if; end process;~IF ~VIVADO ~THEN ~RESULT <= ~FROMBV[~SYM[2]][~TYPO];~ELSE
primitives/CLaSH.Prelude.RAM.json view
@@ -4,9 +4,9 @@ "asyncRam# :: SClock wclk -- ^ wclk, ARG[0] -> SClock rclk -- ^ rclk, ARG[1] -> SNat n -- ^ sz, ARG[2]- -> Signal' wclk Int -- ^ wr, ARG[3]- -> Signal' rclk Int -- ^ rd, ARG[4]- -> Signal' wclk Bool -- ^ en, ARG[5]+ -> Signal' rclk Int -- ^ rd, ARG[3]+ -> Signal' wclk Bool -- ^ en, ARG[4]+ -> Signal' wclk Int -- ^ wr, ARG[5] -> Signal' wclk a -- ^ din, ARG[6] -> Signal' rclk a" , "templateD" :@@ -15,8 +15,8 @@ type ~GENSYM[RamType][4] is array(natural range <>) of std_logic_vector(~SIZE[~TYP[6]]-1 downto 0);~ELSE type ~SYM[4] is array(natural range <>) of ~TYP[6];~FI signal ~GENSYM[RAM][1] : ~SYM[4](0 to ~LIT[2]-1);- signal ~GENSYM[wr][2] : integer range 0 to ~LIT[2] - 1;- signal ~GENSYM[rd][3] : integer range 0 to ~LIT[2] - 1;+ signal ~GENSYM[rd][2] : integer range 0 to ~LIT[2] - 1;+ signal ~GENSYM[wr][3] : integer range 0 to ~LIT[2] - 1; begin ~SYM[2] <= to_integer(~ARG[3]) -- pragma translate_off@@ -24,7 +24,7 @@ -- pragma translate_on ; - ~SYM[3] <= to_integer(~ARG[4])+ ~SYM[3] <= to_integer(~ARG[5]) -- pragma translate_off mod ~LIT[2] -- pragma translate_on@@ -33,14 +33,14 @@ ~GENSYM[asyncRam_sync][5] : process(~CLK[0]) begin if rising_edge(~CLK[0]) then- if ~ARG[5] then~IF ~VIVADO ~THEN- ~SYM[1](~SYM[2]) <= ~TOBV[~ARG[6]][~TYP[6]];~ELSE- ~SYM[1](~SYM[2]) <= ~ARG[6];~FI+ if ~ARG[4] then~IF ~VIVADO ~THEN+ ~SYM[1](~SYM[3]) <= ~TOBV[~ARG[6]][~TYP[6]];~ELSE+ ~SYM[1](~SYM[3]) <= ~ARG[6];~FI end if; end if; end process;~IF ~VIVADO ~THEN- ~RESULT <= ~FROMBV[~SYM[1](~SYM[3])][~TYP[6]];~ELSE- ~RESULT <= ~SYM[1](~SYM[3]);~FI+ ~RESULT <= ~FROMBV[~SYM[1](~SYM[2])][~TYP[6]];~ELSE+ ~RESULT <= ~SYM[1](~SYM[2]);~FI end block; -- asyncRam end" }
primitives/CLaSH.Promoted.Nat.json view
@@ -1,37 +1,34 @@ [ { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.SNat"- , "type" : "SNat :: KnownNat n => Proxy n -> SNat n"- , "templateE" : "~LIT[0]"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.snatToInteger"- , "type" : "snatToInteger :: SNat n -> Integer"- , "templateE" : "~IF ~IW64 ~THEN to_signed(~ARG[0],64) ~ELSE to_signed(~ARG[0],32) ~FI"- }- }-, { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.addSNat"- , "type" : "CLaSH.Promoted.Nat.addSNat :: SNat a -> SNat b -> SNat (a + b)"- , "templateE" : "~LIT[0] + ~LIT[1]"+ { "name" : "CLaSH.Promoted.Nat.powSNat"+ , "type" : "CLaSH.Promoted.Nat.powSNat :: SNat a -> SNat b -> SNat (a^b)"+ , "templateE" : "~LIT[0] ** ~LIT[1]" } } , { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.subSNat"- , "type" : "CLaSH.Promoted.Nat.subSNat :: SNat a -> SNat b -> SNat (a - b)"- , "templateE" : "~LIT[0] - ~LIT[1]"+ { "name" : "CLaSH.Promoted.Nat.flogBaseSNat"+ , "type" : "CLaSH.Promoted.Nat.flogBaseSNat :: (2 <= base, 1 <= x)+ => SNat base -- ARG[2]+ -> SNat x -- ARG[3]+ -> SNat (FLog base x)"+ , "templateE" : "integer(floor(log(real(~LIT[3]),real(~LIT[2]))))" } } , { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.mulSNat"- , "type" : "CLaSH.Promoted.Nat.mulSNat :: SNat a -> SNat b -> SNat (a * b)"- , "templateE" : "~LIT[0] * ~LIT[1]"+ { "name" : "CLaSH.Promoted.Nat.clogBaseSNat"+ , "type" : "CLaSH.Promoted.Nat.clogBaseSNat :: (2 <= base, 1 <= x)+ => SNat base -- ARG[2]+ -> SNat x -- ARG[3]+ -> SNat (CLog base x)"+ , "templateE" : "integer(ceiling(log(real(~LIT[3]),real(~LIT[2]))))" } } , { "BlackBox" :- { "name" : "CLaSH.Promoted.Nat.powSNat"- , "type" : "CLaSH.Promoted.Nat.powSNat :: SNat a -> SNat b -> SNat (a ^ b)"- , "templateE" : "~LIT[0] ** ~LIT[1]"+ { "name" : "CLaSH.Promoted.Nat.logBaseSNat"+ , "type" : "CLaSH.Promoted.Nat.logBaseSNat :: (FLog base x ~ CLog base x)+ => SNat base -- ARG[1]+ -> SNat x -- ARG[2]+ -> SNat (Log base x)"+ , "templateE" : "integer(ceiling(log(real(~LIT[2]),real(~LIT[1]))))" } } ]
primitives/CLaSH.Sized.Internal.BitVector.json view
@@ -404,20 +404,20 @@ } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.BitVector.plus#"- , "type" : "plus# :: KnownNat (Max m n + 1) => BitVector m -> BitVector n -> BitVector (Max m n + 1)"- , "templateE" : "std_logic_vector(resize(unsigned(~ARG[1]),~LIT[0]) + resize(unsigned(~ARG[2]),~LIT[0]))"+ , "type" : "plus# :: BitVector m -> BitVector n -> BitVector (Max m n + 1)"+ , "templateE" : "std_logic_vector(resize(unsigned(~ARG[0]),~SIZE[~TYPO]) + resize(unsigned(~ARG[1]),~SIZE[~TYPO]))" } } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.BitVector.minus#"- , "type" : "minus# :: KnownNat (Max m n + 1) => BitVector m -> BitVector n -> BitVector (Max m n + 1)"- , "templateE" : "std_logic_vector(resize(unsigned(~ARG[1]),~LIT[0]) - resize(unsigned(~ARG[2]),~LIT[0]))"+ , "type" : "minus# :: (KnownNat m, KnownNat n) => BitVector m -> BitVector n -> BitVector (Max m n + 1)"+ , "templateE" : "std_logic_vector(resize(unsigned(~ARG[2]),~SIZE[~TYPO]) - resize(unsigned(~ARG[3]),~SIZE[~TYPO]))" } } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.BitVector.times#"- , "type" : "times# :: KnownNat (m + n) => BitVector m -> BitVector n -> BitVector (m + n)"- , "templateE" : "std_logic_vector(unsigned(~ARG[1]) * unsigned(~ARG[2]))"+ , "type" : "times# :: BitVector m -> BitVector n -> BitVector (m + n)"+ , "templateE" : "std_logic_vector(unsigned(~ARG[0]) * unsigned(~ARG[1]))" } } , { "BlackBox" :@@ -470,8 +470,8 @@ } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.BitVector.shiftR#"- , "type" : "shiftR# :: KnownNat n => BitVector n -> Int -> BitVector n"- , "templateE" : "std_logic_vector(shift_right(unsigned(~ARG[1]),to_integer(~ARG[2])))"+ , "type" : "shiftR# :: BitVector n -> Int -> BitVector n"+ , "templateE" : "std_logic_vector(shift_right(unsigned(~ARG[0]),to_integer(~ARG[1])))" } } , { "BlackBox" :
primitives/CLaSH.Sized.Internal.Signed.json view
@@ -106,20 +106,20 @@ } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.Signed.plus#"- , "type" : "plus# :: KnownNat (1 + Max m n) => Signed m -> Signed n -> Signed (1 + Max m n)"- , "templateE" : "resize(~ARG[1],~LIT[0]) + resize(~ARG[2],~LIT[0])"+ , "type" : "plus# :: Signed m -> Signed n -> Signed (1 + Max m n)"+ , "templateE" : "resize(~ARG[0],~SIZE[~TYPO]) + resize(~ARG[1],~SIZE[~TYPO])" } } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.Signed.minus#"- , "type" : "minus# :: KnownNat (1 + Max m n) => Signed m -> Signed n -> Signed (1 + Max m n)"- , "templateE" : "resize(~ARG[1],~LIT[0]) - resize(~ARG[2],~LIT[0])"+ , "type" : "minus# :: Signed m -> Signed n -> Signed (1 + Max m n)"+ , "templateE" : "resize(~ARG[0],~SIZE[~TYPO]) - resize(~ARG[1],~SIZE[~TYPO])" } } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.Signed.times#"- , "type" : "times# :: KnownNat (m + n) => Signed m -> Signed n -> Signed (m + n)"- , "templateE" : "~ARG[1] * ~ARG[2]"+ , "type" : "times# :: Signed m -> Signed n -> Signed (m + n)"+ , "templateE" : "~ARG[0] * ~ARG[1]" } } , { "BlackBox" :
primitives/CLaSH.Sized.Internal.Unsigned.json view
@@ -98,20 +98,20 @@ } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.Unsigned.plus#"- , "type" : "plus# :: KnownNat (1 + Max m n) => Unsigned m -> Unsigned n -> Unsigned (1 + Max m n)"- , "templateE" : "resize(~ARG[1],~LIT[0]) + resize(~ARG[2],~LIT[0])"+ , "type" : "plus# :: Unsigned m -> Unsigned n -> Unsigned (1 + Max m n)"+ , "templateE" : "resize(~ARG[0],~SIZE[~TYPO]) + resize(~ARG[1],~SIZE[~TYPO])" } } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.Unsigned.minus#"- , "type" : "minus# :: KnownNat (1 + Max m n) => Unsigned m -> Unsigned n -> Unsigned (1 + Max m n)"- , "templateE" : "resize(~ARG[1],~LIT[0]) - resize(~ARG[2],~LIT[0])"+ , "type" : "minus# :: (KnownNat m,KnownNat n) => Unsigned m -> Unsigned n -> Unsigned (1 + Max m n)"+ , "templateE" : "resize(~ARG[2],~SIZE[~TYPO]) - resize(~ARG[3],~SIZE[~TYPO])" } } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.Unsigned.times#"- , "type" : "times# :: KnownNat (m + n) => Unsigned m -> Unsigned n -> Unsigned (m + n)"- , "templateE" : "~ARG[1] * ~ARG[2]"+ , "type" : "times# :: Unsigned m -> Unsigned n -> Unsigned (m + n)"+ , "templateE" : "~ARG[0] * ~ARG[1]" } } , { "BlackBox" :@@ -164,8 +164,8 @@ } , { "BlackBox" : { "name" : "CLaSH.Sized.Internal.Unsigned.shiftR#"- , "type" : "shiftR# :: KnownNat n => Unsigned n -> Int -> Unsigned n"- , "templateE" : "shift_right(~ARG[1],to_integer(~ARG[2]))"+ , "type" : "shiftR# :: Unsigned n -> Int -> Unsigned n"+ , "templateE" : "shift_right(~ARG[0],to_integer(~ARG[1]))" } } , { "BlackBox" :
+ primitives/CLaSH.Sized.RTree.json view
@@ -0,0 +1,36 @@+[ { "BlackBox" :+ { "name" : "CLaSH.Sized.RTree.treplicate"+ , "type" : "replicate :: SNat n -> a -> RTree d a"+ , "templateE" : "~TYPMO'(0 to (2**~LIT[0])-1 => ~ARG[1])"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.RTree.textract"+ , "type" : "textract :: RTree 0 a -> a"+ , "templateD" :+"-- textract begin+textract_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= ~SYM[1](0);+end block;+-- textract end"+ }+ }+, { "BlackBox" :+ { "name" : "CLaSH.Sized.RTree.tsplit"+ , "type" : "tsplit:: RTree (d+1) a -> (RTree d a,RTree d a)"+ , "templateD" :+"-- tsplit begin+textract_~SYM[0] : block+ signal ~SYM[1] : ~TYP[0];+begin+ ~SYM[1] <= ~ARG[0];+ ~RESULT <= (~SYM[1](0 to (2**(~DEPTH[~TYP[0]]-1))-1)+ ,~SYM[1](2**(~DEPTH[~TYP[0]]-1) to (2**~DEPTH[~TYP[0]])-1));+end block;+-- tsplit end"+ }+ }+]
primitives/GHC.CString.json view
@@ -3,6 +3,11 @@ , "templateE" : "~LIT[0]" } }+, { "BlackBox" :+ { "name" : "GHC.CString.unpackFoldrCString#"+ , "templateE" : "~LIT[0]"+ }+ } , { "Primitive" : { "name" : "GHC.CString.unpackCStringUtf8#" , "primType" : "Function"
+ primitives/GHC.Integer.Logarithms.json view
@@ -0,0 +1,7 @@+[ { "BlackBox" :+ { "name" : "GHC.Integer.Logarithms.integerLogBase#"+ , "type" : "integerLogBase# :: Integer -> Integer -> Int#"+ , "templateE" : "integer(floor(log(real(~ARG[1]),real(~ARG[0]))))"+ }+ }+]
src/CLaSH/Backend/VHDL.hs view
@@ -20,6 +20,7 @@ import Control.Monad (forM,join,liftM,zipWithM) import Control.Monad.State (State) import Data.Graph.Inductive (Gr, mkGraph, topsort')+import Data.Hashable (Hashable (..)) import Data.HashMap.Lazy (HashMap) import qualified Data.HashMap.Lazy as HashMap import Data.HashSet (HashSet)@@ -55,6 +56,9 @@ , _nameCache :: (HashMap HWType Doc) -- ^ Cache for previously generated product type names , _modNm :: String , _srcSpan :: SrcSpan+ , _libraries :: [T.Text]+ , _packages :: [T.Text]+ , _includes :: [(String,Doc)] , _intWidth :: Int -- ^ Int/Word/Integer bit-width , _hdlsyn :: HdlSyn -- ^ For which HDL synthesis tool are we generating VHDL }@@ -62,7 +66,7 @@ makeLenses ''VHDLState instance Backend VHDLState where- initBackend = VHDLState HashSet.empty [] HashMap.empty "" noSrcSpan+ initBackend = VHDLState HashSet.empty [] HashMap.empty "" noSrcSpan [] [] [] #ifdef CABAL primDir = const (Paths_clash_vhdl.getDataFileName "primitives") #else@@ -122,16 +126,22 @@ else s -- | Generate VHDL for a Netlist component-genVHDL :: String -> SrcSpan -> Component -> VHDLM (String,Doc)+genVHDL :: String -> SrcSpan -> Component -> VHDLM ((String,Doc),[(String,Doc)]) genVHDL nm sp c = do setSrcSpan sp- (unpack cName,) A.<$> vhdl+ v <- vhdl+ i <- use includes+ return ((unpack cName,v),i) where cName = componentName c- vhdl = "-- Automatically generated VHDL-93" <$$>- tyImports nm <$$> linebreak <>- entity c <$$> linebreak <>- architecture c+ vhdl = do+ ent <- entity c+ arch <- architecture c+ imps <- tyImports nm+ ("-- Automatically generated VHDL-93" <$$>+ pure imps <$$> linebreak <>+ pure ent <$$> linebreak <>+ pure arch) -- | Generate a VHDL package containing type definitions for the given HWTypes mkTyPackage_ :: String@@ -177,6 +187,7 @@ mkUsedTys :: HWType -> [HWType] mkUsedTys v@(Vector _ elTy) = v : mkUsedTys elTy+mkUsedTys v@(RTree _ elTy) = v : mkUsedTys elTy mkUsedTys p@(Product _ elTys) = p : concatMap mkUsedTys elTys mkUsedTys sp@(SP _ elTys) = sp : concatMap mkUsedTys (concatMap snd elTys) mkUsedTys t = [t]@@ -193,12 +204,15 @@ edge t@(Vector _ elTy) = maybe [] ((:[]) . (HashMap.lookupDefault (error $ $(curLoc) ++ "Vector") t nodesI,,())) (HashMap.lookup (mkVecZ elTy) nodesI)+ edge t@(RTree _ elTy) = maybe [] ((:[]) . (HashMap.lookupDefault (error $ $(curLoc) ++ "RTree") t nodesI,,()))+ (HashMap.lookup (mkVecZ elTy) nodesI) edge t@(Product _ tys) = let ti = HashMap.lookupDefault (error $ $(curLoc) ++ "Product") t nodesI in mapMaybe (\ty -> liftM (ti,,()) (HashMap.lookup (mkVecZ ty) nodesI)) tys edge _ = [] normaliseType :: HWType -> HWType normaliseType (Vector n ty) = Vector n (normaliseType ty)+normaliseType (RTree d ty) = RTree d (normaliseType ty) normaliseType (Product nm tys) = Product nm (map normaliseType tys) normaliseType ty@(SP _ _) = BitVector (typeSize ty) normaliseType ty@(Index _) = Unsigned (typeSize ty)@@ -207,6 +221,7 @@ mkVecZ :: HWType -> HWType mkVecZ (Vector _ elTy) = Vector 0 elTy+mkVecZ (RTree _ elTy) = RTree 0 elTy mkVecZ t = t tyDec :: HWType -> VHDLM Doc@@ -218,6 +233,13 @@ _ -> "type" <+> "array_of_" <> tyName elTy <+> "is array (integer range <>) of" <+> vhdlType elTy <> semi +tyDec (RTree _ elTy) = do+ syn <- hdlSyn+ case syn of+ Vivado -> "type" <+> "tree_of_" <> tyName elTy <+> "is array (integer range <>) of"+ <+> "std_logic_vector" <> parens (int (typeSize elTy - 1) <+> "downto 0") <> semi+ _ -> "type" <+> "tree_of_" <> tyName elTy <+> "is array (integer range <>) of" <+> vhdlType elTy <> semi+ tyDec ty@(Product _ tys@(_:_:_)) = prodDec where prodDec = "type" <+> tName <+> "is record" <$>@@ -334,20 +356,46 @@ "end" <> semi ) +funDec syn t@(RTree _ elTy) = Just+ ( "function" <+> "toSLV" <+> parens ("value : " <+> vhdlTypeMark t) <+> "return std_logic_vector" <> semi+ , "function" <+> "toSLV" <+> parens ("value : " <+> vhdlTypeMark t) <+> "return std_logic_vector" <+> "is" <$>+ indent 2+ ( "alias ivalue :" <+> vhdlTypeMark t <> "(1 to value'length) is value;" <$>+ "variable result :" <+> "std_logic_vector" <> parens ("1 to value'length * " <> int (typeSize elTy)) <> semi+ ) <$>+ "begin" <$>+ indent 2+ ("for i in ivalue'range loop" <$>+ indent 2+ ( "result" <> parens (parens ("(i - 1) * " <> int (typeSize elTy)) <+> "+ 1" <+>+ "to i*" <> int (typeSize elTy)) <+>+ ":=" <+> (case syn of+ Vivado -> "ivalue" <> parens ("i")+ _ -> "toSLV" <> parens ("ivalue" <> parens ("i"))) <> semi+ ) <$>+ "end" <+> "loop" <> semi <$>+ "return" <+> "result" <> semi+ ) <$>+ "end" <> semi+ )+ funDec _ _ = Nothing tyImports :: String -> VHDLM Doc tyImports nm = do mkId <- mkBasicId+ libs <- use libraries+ packs <- use packages punctuate' semi $ sequence- [ "library IEEE"- , "use IEEE.STD_LOGIC_1164.ALL"- , "use IEEE.NUMERIC_STD.ALL"- , "use IEEE.MATH_REAL.ALL"- , "use std.textio.all"- , "use work.all"- , "use work." <> text (mkId (T.pack nm `T.append` "_types")) <> ".all"- ]+ ([ "library IEEE"+ , "use IEEE.STD_LOGIC_1164.ALL"+ , "use IEEE.NUMERIC_STD.ALL"+ , "use IEEE.MATH_REAL.ALL"+ , "use std.textio.all"+ , "use work.all"+ , "use work." <> text (mkId (T.pack nm `T.append` "_types")) <> ".all"+ ] ++ (map (("library" <+>) . text) (nub libs))+ ++ (map (("use" <+>) . text) (nub packs))) entity :: Component -> VHDLM Doc entity c = do@@ -402,6 +450,9 @@ go (Vector n elTy) = do nm <- use modNm text (T.toLower $ T.pack nm) <> "_types.array_of_" <> tyName elTy <> parens ("0 to " <> int (n-1))+ go (RTree d elTy) = do+ nm <- use modNm+ text (T.toLower $ T.pack nm) <> "_types.tree_of_" <> tyName elTy <> parens ("0 to " <> int ((2^d)-1)) go t@(Product _ _) = do nm <- use modNm text (T.toLower $ T.pack nm) <> "_types." <> tyName t@@ -428,6 +479,9 @@ go (Vector _ elTy) = do nm <- use modNm text (T.toLower $ T.pack nm) <> "_types.array_of_" <> tyName elTy+ go (RTree _ elTy) = do+ nm <- use modNm+ text (T.toLower $ T.pack nm) <> "_types.tree_of_" <> tyName elTy go t@(Product _ _) = do nm <- use modNm text (T.toLower $ T.pack nm) <> "_types." <> tyName t@@ -438,6 +492,7 @@ tyName (Clock _ _) = "std_logic" tyName (Reset _ _) = "std_logic" tyName (Vector n elTy) = "array_of_" <> int n <> "_" <> tyName elTy+tyName (RTree n elTy) = "tree_of_" <> int n <> "_" <> tyName elTy tyName (BitVector n) = "std_logic_vector_" <> int n tyName t@(Index _) = "unsigned_" <> int (typeSize t) tyName (Signed n) = "signed_" <> int n@@ -476,6 +531,13 @@ "std_logic_vector'" <> parens (int 0 <+> "to" <+> int (typeSize elTy - 1) <+> rarrow <+> "'X'")) _ -> vhdlTypeMark t <> "'" <> parens (int 0 <+> "to" <+> int (n-1) <+> rarrow <+> vhdlTypeErrValue elTy)+vhdlTypeErrValue t@(RTree n elTy) = do+ syn <-hdlSyn+ case syn of+ Vivado -> vhdlTypeMark t <> "'" <> parens (int 0 <+> "to" <+> int (2^n - 1) <+> rarrow <+>+ "std_logic_vector'" <> parens (int 0 <+> "to" <+> int (typeSize elTy - 1) <+>+ rarrow <+> "'X'"))+ _ -> vhdlTypeMark t <> "'" <> parens (int 0 <+> "to" <+> int (2^n - 1) <+> rarrow <+> vhdlTypeErrValue elTy) vhdlTypeErrValue t@(Product _ elTys) = vhdlTypeMark t <> "'" <> tupled (mapM vhdlTypeErrValue elTys) vhdlTypeErrValue (Reset _ _) = "'X'" vhdlTypeErrValue (Clock _ _) = "'X'"@@ -536,9 +598,26 @@ rec (p,ls) <- fmap unzip $ sequence [ (,fromIntegral (T.length i)) A.<$> fill (maximum ls) (text i) <+> "=>" <+> expr_ False e | (i,_,_,e) <- pms] nest 2 $ "port map" <$$> tupled (A.pure p) -inst_ (BlackBoxD _ bs bbCtx) = do t <- renderBlackBox bs bbCtx- fmap Just (string t)+inst_ (BlackBoxD _ libs packs Nothing bs bbCtx) = do+ libraries %= ((map T.fromStrict libs) ++)+ packages %= ((map T.fromStrict packs) ++)+ t <- renderBlackBox bs bbCtx+ fmap Just (string t) +inst_ (BlackBoxD _ libs packs (Just (nm,inc)) bs bbCtx) = do+ libraries %= ((map T.fromStrict libs) ++)+ packages %= ((map T.fromStrict packs) ++)+ inc' <- renderBlackBox inc bbCtx+ iw <- use intWidth+ let incHash = hash inc'+ nm' = T.concat [ T.fromStrict nm+ , T.pack (printf ("%0" ++ show (iw `div` 4) ++ "X") incHash)+ ]+ t <- renderBlackBox bs (bbCtx {bbQsysIncName = Just nm'})+ inc'' <- text inc'+ includes %= ((unpack nm', inc''):)+ fmap Just (string t)+ inst_ _ = return Nothing -- | Turn a Netlist expression into a VHDL expression@@ -568,6 +647,15 @@ _ -> text id_ <> parens (int 0) expr_ _ (Identifier id_ (Just (Indexed ((Vector n _),1,2)))) = text id_ <> parens (int 1 <+> "to" <+> int (n-1)) +expr_ _ (Identifier id_ (Just (Indexed ((RTree 0 _),0,1)))) = text id_ <> parens (int 0)+expr_ _ (Identifier id_ (Just (Indexed ((RTree n _),1,1)))) =+ let z = 2^(n-1)+ in text id_ <> parens (int 0 <+> "to" <+> int (z-1))+expr_ _ (Identifier id_ (Just (Indexed ((RTree n _),1,2)))) =+ let z = 2^(n-1)+ z' = 2^n+ in text id_ <> parens (int z <+> "to" <+> int (z'-1))+ -- This is a HACK for CLaSH.Driver.TopWrapper.mkOutput -- Vector's don't have a 10'th constructor, this is just so that we can -- recognize the particular case@@ -579,6 +667,11 @@ fromSLV elTy id' (typeSize elTy - 1) 0 _ -> text id_ <> parens (int fI) +-- This is a HACK for CLaSH.Driver.TopWrapper.mkOutput+-- RTree's don't have a 10'th constructor, this is just so that we can+-- recognize the particular case+expr_ _ (Identifier id_ (Just (Indexed ((RTree _ _),10,fI)))) = text id_ <> parens (int fI)+ expr_ _ (Identifier id_ (Just (DC (ty@(SP _ _),_)))) = text id_ <> parens (int start <+> "downto" <+> int end) where start = typeSize ty - 1@@ -595,8 +688,7 @@ expr_ b (DataCon _ (DC (Void, -1)) [e]) = expr_ b e -expr_ _ (DataCon (Vector 0 _) _ _) =- error $ $(curLoc) ++ "VHDL: Trying to create a Nil vector."+expr_ _ (DataCon ty@(Vector 0 _) _ _) = vhdlTypeErrValue ty expr_ _ (DataCon ty@(Vector 1 elTy) _ [e]) = do syn <- hdlSyn@@ -612,6 +704,24 @@ _ -> vhdlTypeMark ty <> "'" <> case vectorChain e of Just es -> tupled (mapM (expr_ False) es) Nothing -> parens (vhdlTypeMark elTy <> "'" <> parens (expr_ False e1) <+> "&" <+> expr_ False e2)++expr_ _ (DataCon ty@(RTree 0 elTy) _ [e]) = do+ syn <- hdlSyn+ case syn of+ Vivado -> vhdlTypeMark ty <> "'" <> parens (int 0 <+> rarrow <+> toSLV elTy e)+ _ -> vhdlTypeMark ty <> "'" <> parens (int 0 <+> rarrow <+> expr_ False e)+expr_ _ e@(DataCon ty@(RTree d elTy) _ [e1,e2]) = do+ syn <- hdlSyn+ case syn of+ Vivado -> vhdlTypeMark ty <> "'" <> case rtreeChain e of+ Just es -> tupled (mapM (toSLV elTy) es)+ Nothing -> parens ("std_logic_vector'" <> parens (toSLV elTy e1) <+>+ "&" <+> expr_ False e2)+ _ -> vhdlTypeMark ty <> "'" <> case rtreeChain e of+ Just es -> tupled (mapM (expr_ False) es)+ Nothing -> parens (vhdlTypeMark (RTree (d-1) elTy) <> "'" <> parens (expr_ False e1) <+>+ "&" <+> expr_ False e2)+ expr_ _ (DataCon ty@(SP _ args) (DC (_,i)) es) = assignExpr where argTys = snd $ args !! i@@ -627,29 +737,29 @@ expr_ _ (DataCon ty@(Product _ _) _ es) = tupled $ zipWithM (\i e' -> tyName ty <> "_sel" <> int i <+> rarrow <+> expr_ False e') [0..] es -expr_ _ (BlackBoxE pNm _ bbCtx _)+expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _) | pNm == "CLaSH.Sized.Internal.Signed.fromInteger#" , [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx = exprLit (Just (Signed (fromInteger n),fromInteger n)) i -expr_ _ (BlackBoxE pNm _ bbCtx _)+expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _) | pNm == "CLaSH.Sized.Internal.Unsigned.fromInteger#" , [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx = exprLit (Just (Unsigned (fromInteger n),fromInteger n)) i -expr_ _ (BlackBoxE pNm _ bbCtx _)+expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _) | pNm == "CLaSH.Sized.Internal.BitVector.fromInteger#" , [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx = exprLit (Just (BitVector (fromInteger n),fromInteger n)) i -expr_ _ (BlackBoxE pNm _ bbCtx _)+expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _) | pNm == "CLaSH.Sized.Internal.Index.fromInteger#" , [Literal _ (NumLit n), Literal _ i] <- extractLiterals bbCtx , Just k <- clogBase 2 n , let k' = max 1 k = exprLit (Just (Unsigned k',k')) i -expr_ _ (BlackBoxE pNm _ bbCtx _)+expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _) | pNm == "CLaSH.Sized.Internal.Index.maxBound#" , [Literal _ (NumLit n)] <- extractLiterals bbCtx , n > 0@@ -657,22 +767,38 @@ , let k' = max 1 k = exprLit (Just (Unsigned k',k')) (NumLit (n-1)) -expr_ _ (BlackBoxE pNm _ bbCtx _)+expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _) | pNm == "GHC.Types.I#" , [Literal _ (NumLit n)] <- extractLiterals bbCtx = do iw <- use intWidth exprLit (Just (Signed iw,iw)) (NumLit n) -expr_ _ (BlackBoxE pNm _ bbCtx _)+expr_ _ (BlackBoxE pNm _ _ _ _ bbCtx _) | pNm == "GHC.Types.W#" , [Literal _ (NumLit n)] <- extractLiterals bbCtx = do iw <- use intWidth exprLit (Just (Unsigned iw,iw)) (NumLit n) -expr_ b (BlackBoxE _ bs bbCtx b') = do+expr_ b (BlackBoxE _ libs packs Nothing bs bbCtx b') = do+ libraries %= ((map T.fromStrict libs) ++)+ packages %= ((map T.fromStrict packs) ++) t <- renderBlackBox bs bbCtx parenIf (b || b') $ string t +expr_ b (BlackBoxE _ libs packs (Just (nm,inc)) bs bbCtx b') = do+ libraries %= ((map T.fromStrict libs) ++)+ packages %= ((map T.fromStrict packs) ++)+ inc' <- renderBlackBox inc bbCtx+ iw <- use intWidth+ let incHash = hash inc'+ nm' = T.concat [ T.fromStrict nm+ , T.pack (printf ("%0" ++ show (iw `div` 4) ++ "X") incHash)+ ]+ t <- renderBlackBox bs (bbCtx {bbQsysIncName = Just nm'})+ inc'' <- text inc'+ includes %= ((unpack nm', inc''):)+ parenIf (b || b') $ string t+ expr_ _ (DataTag Bool (Left id_)) = "tagToEnum" <> parens (text id_) expr_ _ (DataTag Bool (Right id_)) = "dataToTag" <> parens (text id_) @@ -702,6 +828,13 @@ iw <- use intWidth "to_signed" <> parens (int 1 <> "," <> int iw) +expr_ _ (DataTag (RTree 0 _) (Right _)) = do+ iw <- use intWidth+ "to_signed" <> parens (int 0 <> "," <> int iw)+expr_ _ (DataTag (RTree _ _) (Right _)) = do+ iw <- use intWidth+ "to_signed" <> parens (int 1 <> "," <> int iw)+ expr_ _ e = error $ $(curLoc) ++ (show e) -- empty otherSize :: [HWType] -> Int -> Int@@ -715,6 +848,11 @@ vectorChain (DataCon (Vector _ _) _ [e1,e2]) = Just e1 <:> vectorChain e2 vectorChain _ = Nothing +rtreeChain :: Expr -> Maybe [Expr]+rtreeChain (DataCon (RTree 1 _) _ [e]) = Just [e]+rtreeChain (DataCon (RTree _ _) _ [e1,e2]) = A.liftA2 (++) (rtreeChain e1) (rtreeChain e2)+rtreeChain _ = Nothing+ exprLit :: Maybe (HWType,Size) -> Literal -> VHDLM Doc exprLit Nothing (NumLit i) = integer i @@ -724,13 +862,13 @@ | otherwise -> "unsigned'" <> parens (if sz `mod` 4 == 0 then hlit else blit) Signed n | i < 2^(31 :: Integer) && i > (-2^(31 :: Integer)) -> "to_signed" <> parens (integer i <> "," <> int n)- | otherwise -> "signed'" <> parens hlit+ | otherwise -> "signed'" <> parens (if sz `mod` 4 == 0 then hlit else blit) BitVector _ -> "std_logic_vector'" <> parens (if sz `mod` 4 == 0 then hlit else blit) _ -> blit where blit = bits (toBits sz i)- hlit = hex (toHex sz i)+ hlit = (if i < 0 then "-" else empty) <> hex (toHex sz i) exprLit _ (BoolLit t) = if t then "true" else "false" exprLit _ (BitLit b) = squotes $ bit_char b exprLit _ (StringLit s) = text . T.pack $ show s@@ -761,7 +899,7 @@ toHex :: Int -> Integer -> String toHex sz i = let Just d = clogBase 16 (2^sz)- in printf ("%0" ++ show d ++ "X") i+ in printf ("%0" ++ show d ++ "X") (abs i) hex :: String -> VHDLM Doc hex s = char 'x' <> dquotes (text (T.pack s))