clash-lib-1.6.0: prims/vhdl/Clash_Explicit_BlockRam.primitives.yaml
- BlackBox:
name: Clash.Explicit.BlockRam.blockRam#
kind: Declaration
type: |-
blockRam#
:: ( KnownDomain dom ARG[0]
, HasCallStack -- ARG[1]
, Undefined a ) -- ARG[2]
=> Clock dom -- clk, ARG[3]
-> Enable dom -- en, ARG[4]
-> Vec n a -- init, ARG[5]
-> Signal dom Int -- rd, ARG[6]
-> Signal dom Bool -- wren, ARG[7]
-> Signal dom Int -- wr, ARG[8]
-> Signal dom a -- din, ARG[9]
-> Signal dom a
template: |-
-- blockRam begin
~GENSYM[~RESULT_blockRam][1] : block
signal ~GENSYM[~RESULT_RAM][2] : ~TYP[5] := ~CONST[5];
signal ~GENSYM[rd][4] : integer range 0 to ~LENGTH[~TYP[5]] - 1;
signal ~GENSYM[wr][5] : integer range 0 to ~LENGTH[~TYP[5]] - 1;
begin
~SYM[4] <= to_integer(~VAR[rdI][6](31 downto 0))
-- pragma translate_off
mod ~LENGTH[~TYP[5]]
-- pragma translate_on
;
~SYM[5] <= to_integer(~VAR[wrI][8](31 downto 0))
-- pragma translate_off
mod ~LENGTH[~TYP[5]]
-- pragma translate_on
;
~IF ~VIVADO ~THEN
~SYM[6] : process(~ARG[3])
begin
if ~IF~ACTIVEEDGE[Rising][0]~THENrising_edge~ELSEfalling_edge~FI(~ARG[3]) then
if ~ARG[7] ~IF ~ISACTIVEENABLE[4] ~THEN and ~ARG[4] ~ELSE ~FI then
~SYM[2](~SYM[5]) <= ~TOBV[~ARG[9]][~TYP[9]];
end if;
~RESULT <= fromSLV(~SYM[2](~SYM[4]));
end if;
end process; ~ELSE
~SYM[6] : process(~ARG[3])
begin
if ~IF~ACTIVEEDGE[Rising][0]~THENrising_edge~ELSEfalling_edge~FI(~ARG[3]) then
if ~ARG[7] ~IF ~ISACTIVEENABLE[4] ~THEN and ~ARG[4] ~ELSE ~FI then
~SYM[2](~SYM[5]) <= ~ARG[9];
end if;
~RESULT <= ~SYM[2](~SYM[4]);
end if;
end process; ~FI
end block;
--end blockRam
- BlackBox:
name: Clash.Explicit.BlockRam.blockRamU#
kind: Declaration
type: |-
blockRamU#
:: ( KnownDomain dom ARG[0]
, HasCallStack -- ARG[1]
, Undefined a ) -- ARG[2]
=> Clock dom -- clk, ARG[3]
-> Enable dom -- en, ARG[4]
-> SNat n -- len, ARG[5]
-> Signal dom Int -- rd, ARG[6]
-> Signal dom Bool -- wren, ARG[7]
-> Signal dom Int -- wr, ARG[8]
-> Signal dom a -- din, ARG[9]
-> Signal dom a
template: |-
-- blockRamU begin
~GENSYM[~RESULT_blockRam][1] : block~IF~VIVADO~THEN
type ~GENSYM[ram_t][8] is array (0 to integer'(~LIT[5])-1) of std_logic_vector(~SIZE[~TYP[9]]-1 downto 0);~ELSE
type ~SYM[8] is array (0 to integer'(~LIT[5])-1) of ~TYP[9];~FI
signal ~GENSYM[~RESULT_RAM][2] : ~SYM[8];
signal ~GENSYM[rd][4] : integer range 0 to ~LIT[5] - 1;
signal ~GENSYM[wr][5] : integer range 0 to ~LIT[5] - 1;
begin
~SYM[4] <= to_integer(~VAR[rdI][6](31 downto 0))
-- pragma translate_off
mod ~LIT[5]
-- pragma translate_on
;
~SYM[5] <= to_integer(~VAR[wrI][8](31 downto 0))
-- pragma translate_off
mod ~LIT[5]
-- pragma translate_on
;
~IF ~VIVADO ~THEN
~SYM[6] : process(~ARG[3])
begin
if ~IF~ACTIVEEDGE[Rising][0]~THENrising_edge~ELSEfalling_edge~FI(~ARG[3]) then
if ~ARG[7] ~IF ~ISACTIVEENABLE[4] ~THEN and ~ARG[4] ~ELSE ~FI then
~SYM[2](~SYM[5]) <= ~TOBV[~ARG[9]][~TYP[9]];
end if;
~RESULT <= fromSLV(~SYM[2](~SYM[4]));
end if;
end process; ~ELSE
~SYM[6] : process(~ARG[3])
begin
if ~IF~ACTIVEEDGE[Rising][0]~THENrising_edge~ELSEfalling_edge~FI(~ARG[3]) then
if ~ARG[7] ~IF ~ISACTIVEENABLE[4] ~THEN and ~ARG[4] ~ELSE ~FI then
~SYM[2](~SYM[5]) <= ~ARG[9];
end if;
~RESULT <= ~SYM[2](~SYM[4]);
end if;
end process; ~FI
end block;
--end blockRamU
- BlackBox:
name: Clash.Explicit.BlockRam.blockRam1#
kind: Declaration
type: |-
blockRam1#
:: ( KnownDomain dom ARG[0]
, HasCallStack -- ARG[1]
, Undefined a ) -- ARG[2]
=> Clock dom -- clk, ARG[3]
-> Enable dom -- en, ARG[4]
-> SNat n -- len, ARG[5]
-> a -- init, ARG[6]
-> Signal dom Int -- rd, ARG[7]
-> Signal dom Bool -- wren, ARG[8]
-> Signal dom Int -- wr, ARG[9]
-> Signal dom a -- din, ARG[10]
-> Signal dom a
template: |-
-- blockRam1 begin
~GENSYM[~RESULT_blockRam][1] : block~IF~VIVADO~THEN
type ~GENSYM[ram_t][8] is array (0 to integer'(~LIT[5])-1) of std_logic_vector(~SIZE[~TYP[6]]-1 downto 0);~ELSE
type ~SYM[8] is array (0 to integer'(~LIT[5])-1) of ~TYP[6];~FI
signal ~GENSYM[~RESULT_RAM][2] : ~SYM[8] := (others => ~IF~VIVADO~THEN~TOBV[~CONST[6]][~TYP[6]]~ELSE~CONST[6]~FI);
signal ~GENSYM[rd][4] : integer range 0 to ~LIT[5] - 1;
signal ~GENSYM[wr][5] : integer range 0 to ~LIT[5] - 1;
begin
~SYM[4] <= to_integer(~VAR[rdI][7](31 downto 0))
-- pragma translate_off
mod ~LIT[5]
-- pragma translate_on
;
~SYM[5] <= to_integer(~VAR[wrI][9](31 downto 0))
-- pragma translate_off
mod ~LIT[5]
-- pragma translate_on
;
~IF ~VIVADO ~THEN
~SYM[6] : process(~ARG[3])
begin
if ~IF~ACTIVEEDGE[Rising][0]~THENrising_edge~ELSEfalling_edge~FI(~ARG[3]) then
if ~ARG[8] ~IF ~ISACTIVEENABLE[4] ~THEN and ~ARG[4] ~ELSE ~FI then
~SYM[2](~SYM[5]) <= ~TOBV[~ARG[10]][~TYP[10]];
end if;
~RESULT <= fromSLV(~SYM[2](~SYM[4]));
end if;
end process; ~ELSE
~SYM[6] : process(~ARG[3])
begin
if ~IF~ACTIVEEDGE[Rising][0]~THENrising_edge~ELSEfalling_edge~FI(~ARG[3]) then
if ~ARG[8] ~IF ~ISACTIVEENABLE[4] ~THEN and ~ARG[4] ~ELSE ~FI then
~SYM[2](~SYM[5]) <= ~ARG[10];
end if;
~RESULT <= ~SYM[2](~SYM[4]);
end if;
end process; ~FI
end block;
--end blockRam1
- BlackBox:
name: Clash.Explicit.BlockRam.trueDualPortBlockRam#
kind: Declaration
type: |-
trueDualPortBlockRam# ::
forall nAddrs domA domB a .
( HasCallStack ~ARG[0]
, KnownNat nAddrs ~ARG[1]
, KnownDomain domA ~ARG[2]
, KnownDomain domB ~ARG[3]
, NFDataX a ~ARG[4]
) =>
Clock domA -> ~ARG[5]
Signal domA Bool -> ~ARG[6]
Signal domA Bool -> ~ARG[7]
Signal domA (Index nAddrs) -> ~ARG[8]
Signal domA a -> ~ARG[9]
Clock domB -> ~ARG[10]
Signal domB Bool -> ~ARG[11]
Signal domB Bool -> ~ARG[12]
Signal domB (Index nAddrs) -> ~ARG[13]
Signal domB a -> ~ARG[14]
(Signal domA a, Signal domB a)
template: |-
-- trueDualPortBlockRam begin
~GENSYM[~RESULT_trueDualPortBlockRam][1] : block
-- Shared memory
type mem_type is array ( ~LIT[1]-1 downto 0 ) of ~TYP[9];
shared variable mem : mem_type;
signal ~GENSYM[a_dout][2] : ~TYP[9];
signal ~GENSYM[b_dout][3] : ~TYP[14];
begin
-- Port A
process(~ARG[5])
begin
if(rising_edge(~ARG[5])) then
if(~ARG[6]) then
if(~ARG[7]) then
mem(~IF~SIZE[~TYP[8]]~THENto_integer(~ARG[8])~ELSE0~FI) := ~ARG[9];
end if;
~SYM[2] <= mem(~IF~SIZE[~TYP[8]]~THENto_integer(~ARG[8])~ELSE0~FI);
end if;
end if;
end process;
-- Port B
process(~ARG[10])
begin
if(rising_edge(~ARG[10])) then
if(~ARG[11]) then
if(~ARG[12]) then
mem(~IF~SIZE[~TYP[13]]~THENto_integer(~ARG[13])~ELSE0~FI) := ~ARG[14];
end if;
~SYM[3] <= mem(~IF~SIZE[~TYP[13]]~THENto_integer(~ARG[13])~ELSE0~FI);
end if;
end if;
end process;
~RESULT <= (~SYM[2], ~SYM[3]);
end block;
-- end trueDualPortBlockRam