diff options
-rw-r--r-- | src/synth/synth-objtypes.adb | 180 | ||||
-rw-r--r-- | src/synth/synth-objtypes.ads | 37 | ||||
-rw-r--r-- | src/synth/synth-oper.adb | 12 | ||||
-rw-r--r-- | src/synth/synth-static_oper.adb | 229 | ||||
-rw-r--r-- | src/synth/synth-static_oper.ads | 4 | ||||
-rw-r--r-- | src/synth/synth-values.adb | 131 | ||||
-rw-r--r-- | src/synth/synth-values.ads | 14 |
7 files changed, 355 insertions, 252 deletions
diff --git a/src/synth/synth-objtypes.adb b/src/synth/synth-objtypes.adb index 6292db4db..7fe04b112 100644 --- a/src/synth/synth-objtypes.adb +++ b/src/synth/synth-objtypes.adb @@ -20,6 +20,7 @@ with Ada.Unchecked_Conversion; with System; +with System.Storage_Elements; with Mutils; use Mutils; @@ -562,6 +563,185 @@ package body Synth.Objtypes is end case; end Is_Matching_Bounds; + type Ghdl_U8_Ptr is access all Ghdl_U8; + function To_U8_Ptr is + new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_U8_Ptr); + + procedure Write_U8 (Mem : Memory_Ptr; Val : Ghdl_U8) is + begin + To_U8_Ptr (Mem).all := Val; + end Write_U8; + + function Read_U8 (Mem : Memory_Ptr) return Ghdl_U8 is + begin + return To_U8_Ptr (Mem).all; + end Read_U8; + + function Read_U8 (Mt : Memtyp) return Ghdl_U8 + is + pragma Assert (Mt.Typ.Sz = 1); + begin + return Read_U8 (Mt.Mem); + end Read_U8; + + type Ghdl_I32_Ptr is access all Ghdl_I32; + function To_I32_Ptr is + new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_I32_Ptr); + + procedure Write_I32 (Mem : Memory_Ptr; Val : Ghdl_I32) is + begin + To_I32_Ptr (Mem).all := Val; + end Write_I32; + + function Read_I32 (Mem : Memory_Ptr) return Ghdl_I32 is + begin + return To_I32_Ptr (Mem).all; + end Read_I32; + + type Ghdl_U32_Ptr is access all Ghdl_U32; + function To_U32_Ptr is + new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_U32_Ptr); + + procedure Write_U32 (Mem : Memory_Ptr; Val : Ghdl_U32) is + begin + To_U32_Ptr (Mem).all := Val; + end Write_U32; + + function Read_U32 (Mem : Memory_Ptr) return Ghdl_U32 is + begin + return To_U32_Ptr (Mem).all; + end Read_U32; + + type Ghdl_I64_Ptr is access all Ghdl_I64; + function To_I64_Ptr is + new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_I64_Ptr); + + procedure Write_I64 (Mem : Memory_Ptr; Val : Ghdl_I64) is + begin + To_I64_Ptr (Mem).all := Val; + end Write_I64; + + function Read_I64 (Mem : Memory_Ptr) return Ghdl_I64 is + begin + return To_I64_Ptr (Mem).all; + end Read_I64; + + type Fp64_Ptr is access all Fp64; + function To_Fp64_Ptr is + new Ada.Unchecked_Conversion (Memory_Ptr, Fp64_Ptr); + + procedure Write_Fp64 (Mem : Memory_Ptr; Val : Fp64) is + begin + To_Fp64_Ptr (Mem).all := Val; + end Write_Fp64; + + function Read_Fp64 (Mem : Memory_Ptr) return Fp64 is + begin + return To_Fp64_Ptr (Mem).all; + end Read_Fp64; + + function Read_Fp64 (Mt : Memtyp) return Fp64 is + begin + return Read_Fp64 (Mt.Mem); + end Read_Fp64; + + function "+" (Base : Memory_Ptr; Off : Size_Type) return Memory_Ptr + is + use System.Storage_Elements; + + function To_Address is new Ada.Unchecked_Conversion + (Memory_Ptr, System.Address); + function To_Memory_Ptr is new Ada.Unchecked_Conversion + (System.Address, Memory_Ptr); + begin + return To_Memory_Ptr (To_Address (Base) + Storage_Offset (Off)); + end "+"; + + function Read_Discrete (Mt : Memtyp) return Int64 is + begin + case Mt.Typ.Sz is + when 1 => + return Int64 (Read_U8 (Mt.Mem)); + when 4 => + return Int64 (Read_I32 (Mt.Mem)); + when 8 => + return Int64 (Read_I64 (Mt.Mem)); + when others => + raise Internal_Error; + end case; + end Read_Discrete; + + procedure Write_Discrete (Mem : Memory_Ptr; Typ : Type_Acc; Val : Int64) is + begin + case Typ.Sz is + when 1 => + Write_U8 (Mem, Ghdl_U8 (Val)); + when 4 => + Write_I32 (Mem, Ghdl_I32 (Val)); + when 8 => + Write_I64 (Mem, Ghdl_I64 (Val)); + when others => + raise Internal_Error; + end case; + end Write_Discrete; + + function Alloc_Memory (Vtype : Type_Acc) return Memory_Ptr + is + function To_Memory_Ptr is new Ada.Unchecked_Conversion + (System.Address, Memory_Ptr); + M : System.Address; + begin + Areapools.Allocate (Current_Pool.all, M, + Vtype.Sz, Size_Type (2 ** Natural (Vtype.Al))); + return To_Memory_Ptr (M); + end Alloc_Memory; + + function Create_Memory (Vtype : Type_Acc) return Memtyp is + begin + return (Vtype, Alloc_Memory (Vtype)); + end Create_Memory; + + function Create_Memory_U8 (Val : Ghdl_U8; Vtype : Type_Acc) + return Memtyp + is + pragma Assert (Vtype.Sz = 1); + Res : Memory_Ptr; + begin + Res := Alloc_Memory (Vtype); + Write_U8 (Res, Val); + return (Vtype, Res); + end Create_Memory_U8; + + function Create_Memory_Fp64 (Val : Fp64; Vtype : Type_Acc) + return Memtyp + is + pragma Assert (Vtype.Sz = 8); + Res : Memory_Ptr; + begin + Res := Alloc_Memory (Vtype); + Write_Fp64 (Res, Val); + return (Vtype, Res); + end Create_Memory_Fp64; + + function Create_Memory_Discrete (Val : Int64; Vtype : Type_Acc) + return Memtyp + is + Res : Memory_Ptr; + begin + Res := Alloc_Memory (Vtype); + case Vtype.Sz is + when 1 => + Write_U8 (Res, Ghdl_U8 (Val)); + when 4 => + Write_I32 (Res, Ghdl_I32 (Val)); + when 8 => + Write_I64 (Res, Ghdl_I64 (Val)); + when others => + raise Internal_Error; + end case; + return (Vtype, Res); + end Create_Memory_Discrete; + procedure Init is begin Instance_Pool := Global_Pool'Access; diff --git a/src/synth/synth-objtypes.ads b/src/synth/synth-objtypes.ads index d481d5623..ad9a740ce 100644 --- a/src/synth/synth-objtypes.ads +++ b/src/synth/synth-objtypes.ads @@ -23,6 +23,8 @@ with Areapools; use Areapools; with Netlists; use Netlists; +with Grt.Types; use Grt.Types; + with Vhdl.Nodes; use Vhdl.Nodes; package Synth.Objtypes is @@ -237,6 +239,41 @@ package Synth.Objtypes is function Get_Type_Width (Atype : Type_Acc) return Width; + -- Low-level functions. + + function "+" (Base : Memory_Ptr; Off : Size_Type) return Memory_Ptr; + + procedure Write_U8 (Mem : Memory_Ptr; Val : Ghdl_U8); + function Read_U8 (Mem : Memory_Ptr) return Ghdl_U8; + function Read_U8 (Mt : Memtyp) return Ghdl_U8; + + procedure Write_U32 (Mem : Memory_Ptr; Val : Ghdl_U32); + function Read_U32 (Mem : Memory_Ptr) return Ghdl_U32; + + procedure Write_I32 (Mem : Memory_Ptr; Val : Ghdl_I32); + function Read_I32 (Mem : Memory_Ptr) return Ghdl_I32; + + procedure Write_I64 (Mem : Memory_Ptr; Val : Ghdl_I64); + function Read_I64 (Mem : Memory_Ptr) return Ghdl_I64; + + procedure Write_Fp64 (Mem : Memory_Ptr; Val : Fp64); + function Read_Fp64 (Mem : Memory_Ptr) return Fp64; + function Read_Fp64 (Mt : Memtyp) return Fp64; + + procedure Write_Discrete (Mem : Memory_Ptr; Typ : Type_Acc; Val : Int64); + function Read_Discrete (Mt : Memtyp) return Int64; + + -- Memory allocation. + + function Create_Memory_U8 (Val : Ghdl_U8; Vtype : Type_Acc) + return Memtyp; + function Create_Memory_Fp64 (Val : Fp64; Vtype : Type_Acc) + return Memtyp; + function Create_Memory_Discrete (Val : Int64; Vtype : Type_Acc) + return Memtyp; + + function Create_Memory (Vtype : Type_Acc) return Memtyp; + procedure Init; -- Set by Init. diff --git a/src/synth/synth-oper.adb b/src/synth/synth-oper.adb index c4e44f274..d763a1df9 100644 --- a/src/synth/synth-oper.adb +++ b/src/synth/synth-oper.adb @@ -656,9 +656,10 @@ package body Synth.Oper is Right := Synth_Subtype_Conversion (Right, Right_Typ, False, Expr); if Is_Static_Val (Left.Val) and Is_Static_Val (Right.Val) then - return Synth_Static_Dyadic_Predefined - (Syn_Inst, Imp, - Get_Value_Memtyp (Left), Get_Value_Memtyp (Right), Expr); + return Create_Value_Memtyp + (Synth_Static_Dyadic_Predefined (Syn_Inst, Imp, + Get_Value_Memtyp (Left), + Get_Value_Memtyp (Right), Expr)); end if; Strip_Const (Left); @@ -1385,8 +1386,9 @@ package body Synth.Oper is Strip_Const (Operand); if Is_Static_Val (Operand.Val) then - return Synth_Static_Monadic_Predefined - (Syn_Inst, Imp, Get_Value_Memtyp (Operand), Loc); + return Create_Value_Memtyp (Synth_Static_Monadic_Predefined + (Syn_Inst, Imp, + Get_Value_Memtyp (Operand), Loc)); end if; case Def is diff --git a/src/synth/synth-static_oper.adb b/src/synth/synth-static_oper.adb index 824e5c803..e214b1c09 100644 --- a/src/synth/synth-static_oper.adb +++ b/src/synth/synth-static_oper.adb @@ -21,7 +21,7 @@ with Types; use Types; with Types_Utils; use Types_Utils; -with Grt.Types; +with Grt.Types; use Grt.Types; with Vhdl.Utils; use Vhdl.Utils; with Vhdl.Ieee.Std_Logic_1164; use Vhdl.Ieee.Std_Logic_1164; @@ -237,23 +237,23 @@ package body Synth.Static_Oper is function Synth_Vector_Dyadic (Left, Right : Memtyp; Op : Table_2d; - Loc : Syn_Src) return Valtyp + Loc : Syn_Src) return Memtyp is - Res : Valtyp; + Res : Memtyp; begin if Left.Typ.W /= Right.Typ.W then Error_Msg_Synth (+Loc, "length of operands mismatch"); - return No_Valtyp; + return Null_Memtyp; end if; - Res := Create_Value_Memory (Create_Res_Bound (Left.Typ)); + Res := Create_Memory (Create_Res_Bound (Left.Typ)); for I in 1 .. Uns32 (Vec_Length (Res.Typ)) loop declare Ls : constant Std_Ulogic := Read_Std_Logic (Left.Mem, I - 1); Rs : constant Std_Ulogic := Read_Std_Logic (Right.Mem, I - 1); V : constant Std_Ulogic := Op (Ls, Rs); begin - Write_Std_Logic (Res.Val.Mem, I - 1, V); + Write_Std_Logic (Res.Mem, I - 1, V); end; end loop; @@ -267,21 +267,21 @@ package body Synth.Static_Oper is end loop; end To_Std_Logic_Vector; - function To_Valtyp (Vec : Std_Logic_Vector; El_Typ : Type_Acc) return Valtyp + function To_Memtyp (Vec : Std_Logic_Vector; El_Typ : Type_Acc) return Memtyp is pragma Assert (Vec'First = 1); Res_Typ : Type_Acc; - Res : Valtyp; + Res : Memtyp; begin Res_Typ := Create_Vec_Type_By_Length (Uns32 (Vec'Last), El_Typ); - Res := Create_Value_Memory (Res_Typ); + Res := Create_Memory (Res_Typ); for I in 1 .. Vec'Last loop - Write_Std_Logic (Res.Val.Mem, Uns32 (I - 1), Vec (I)); + Write_Std_Logic (Res.Mem, Uns32 (I - 1), Vec (I)); end loop; return Res; - end To_Valtyp; + end To_Memtyp; - function Synth_Add_Uns_Uns (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Add_Uns_Uns (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (L.Typ))); @@ -292,11 +292,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Add_Uns_Uns (L_Arr, R_Arr); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Add_Uns_Uns; - function Synth_Add_Sgn_Int (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Add_Sgn_Int (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (L.Typ))); @@ -306,11 +306,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Add_Sgn_Int (L_Arr, R_Val); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Add_Sgn_Int; - function Synth_Add_Uns_Nat (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Add_Uns_Nat (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (L.Typ.W)); @@ -320,11 +320,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Add_Uns_Nat (L_Arr, R_Val); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Add_Uns_Nat; - function Synth_Sub_Uns_Uns (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Sub_Uns_Uns (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (L.Typ))); @@ -335,11 +335,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Sub_Uns_Uns (L_Arr, R_Arr); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Sub_Uns_Uns; - function Synth_Sub_Uns_Nat (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Sub_Uns_Nat (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (L.Typ))); @@ -349,11 +349,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Sub_Uns_Nat (L_Arr, R_Val); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Sub_Uns_Nat; - function Synth_Mul_Uns_Uns (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Mul_Uns_Uns (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (L.Typ))); @@ -364,11 +364,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Mul_Uns_Uns (L_Arr, R_Arr); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Mul_Uns_Uns; - function Synth_Mul_Nat_Uns (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Mul_Nat_Uns (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); R_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (R.Typ))); @@ -378,11 +378,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Mul_Nat_Uns (L_Val, R_Arr); begin - return To_Valtyp (Res_Arr, R.Typ.Vec_El); + return To_Memtyp (Res_Arr, R.Typ.Vec_El); end; end Synth_Mul_Nat_Uns; - function Synth_Mul_Uns_Nat (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Mul_Uns_Nat (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (L.Typ))); @@ -392,11 +392,11 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Mul_Uns_Nat (L_Arr, R_Val); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Mul_Uns_Nat; - function Synth_Mul_Sgn_Sgn (L, R : Memtyp; Loc : Syn_Src) return Valtyp + function Synth_Mul_Sgn_Sgn (L, R : Memtyp; Loc : Syn_Src) return Memtyp is pragma Unreferenced (Loc); L_Arr : Std_Logic_Vector (1 .. Natural (Vec_Length (L.Typ))); @@ -407,14 +407,14 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Mul_Sgn_Sgn (L_Arr, R_Arr); begin - return To_Valtyp (Res_Arr, L.Typ.Vec_El); + return To_Memtyp (Res_Arr, L.Typ.Vec_El); end; end Synth_Mul_Sgn_Sgn; function Synth_Shift (Val : Memtyp; Amt : Uns32; Right : Boolean; - Arith : Boolean) return Valtyp + Arith : Boolean) return Memtyp is Len : constant Uns32 := Uns32 (Vec_Length (Val.Typ)); Arr : Std_Logic_Vector (1 .. Natural (Len)); @@ -446,7 +446,7 @@ package body Synth.Static_Oper is end loop; end if; end if; - return To_Valtyp (Arr, Val.Typ.Vec_El); + return To_Memtyp (Arr, Val.Typ.Vec_El); end Synth_Shift; function Get_Static_Ulogic (Op : Memtyp) return Std_Ulogic is @@ -459,7 +459,7 @@ package body Synth.Static_Oper is Imp : Node; Left : Memtyp; Right : Memtyp; - Expr : Node) return Valtyp + Expr : Node) return Memtyp is Def : constant Iir_Predefined_Functions := Get_Implicit_Definition (Imp); @@ -468,143 +468,143 @@ package body Synth.Static_Oper is begin case Def is when Iir_Predefined_Error => - return No_Valtyp; + return Null_Memtyp; when Iir_Predefined_Boolean_Xor => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Boolean'Val (Read_Discrete (Left)) xor Boolean'Val (Read_Discrete (Right))), Res_Typ); when Iir_Predefined_Enum_Equality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) = Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Enum_Inequality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) /= Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Integer_Plus | Iir_Predefined_Physical_Plus => - return Create_Value_Discrete + return Create_Memory_Discrete (Read_Discrete (Left) + Read_Discrete (Right), Res_Typ); when Iir_Predefined_Integer_Minus | Iir_Predefined_Physical_Minus => - return Create_Value_Discrete + return Create_Memory_Discrete (Read_Discrete (Left) - Read_Discrete (Right), Res_Typ); when Iir_Predefined_Integer_Mul | Iir_Predefined_Physical_Integer_Mul | Iir_Predefined_Integer_Physical_Mul => - return Create_Value_Discrete + return Create_Memory_Discrete (Read_Discrete (Left) * Read_Discrete (Right), Res_Typ); when Iir_Predefined_Integer_Div | Iir_Predefined_Physical_Physical_Div | Iir_Predefined_Physical_Integer_Div => - return Create_Value_Discrete + return Create_Memory_Discrete (Read_Discrete (Left) / Read_Discrete (Right), Res_Typ); when Iir_Predefined_Integer_Mod => - return Create_Value_Discrete + return Create_Memory_Discrete (Read_Discrete (Left) mod Read_Discrete (Right), Res_Typ); when Iir_Predefined_Integer_Rem => - return Create_Value_Discrete + return Create_Memory_Discrete (Read_Discrete (Left) rem Read_Discrete (Right), Res_Typ); when Iir_Predefined_Integer_Exp => - return Create_Value_Discrete + return Create_Memory_Discrete (Read_Discrete (Left) ** Natural (Read_Discrete (Right)), Res_Typ); when Iir_Predefined_Physical_Minimum | Iir_Predefined_Integer_Minimum => - return Create_Value_Discrete + return Create_Memory_Discrete (Int64'Min (Read_Discrete (Left), Read_Discrete (Right)), Res_Typ); when Iir_Predefined_Physical_Maximum | Iir_Predefined_Integer_Maximum => - return Create_Value_Discrete + return Create_Memory_Discrete (Int64'Max (Read_Discrete (Left), Read_Discrete (Right)), Res_Typ); when Iir_Predefined_Integer_Less_Equal | Iir_Predefined_Physical_Less_Equal => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) <= Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Integer_Less | Iir_Predefined_Physical_Less => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) < Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Integer_Greater_Equal | Iir_Predefined_Physical_Greater_Equal => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) >= Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Integer_Greater | Iir_Predefined_Physical_Greater => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) > Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Integer_Equality | Iir_Predefined_Physical_Equality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) = Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Integer_Inequality | Iir_Predefined_Physical_Inequality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Discrete (Left) /= Read_Discrete (Right)), Boolean_Type); when Iir_Predefined_Physical_Real_Mul => - return Create_Value_Discrete + return Create_Memory_Discrete (Int64 (Fp64 (Read_Discrete (Left)) * Read_Fp64 (Right)), Res_Typ); when Iir_Predefined_Real_Physical_Mul => - return Create_Value_Discrete + return Create_Memory_Discrete (Int64 (Read_Fp64 (Left) * Fp64 (Read_Discrete (Right))), Res_Typ); when Iir_Predefined_Physical_Real_Div => - return Create_Value_Discrete + return Create_Memory_Discrete (Int64 (Fp64 (Read_Discrete (Left)) / Read_Fp64 (Right)), Res_Typ); when Iir_Predefined_Floating_Less => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Fp64 (Left) < Read_Fp64 (Right)), Boolean_Type); when Iir_Predefined_Floating_Less_Equal => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Fp64 (Left) <= Read_Fp64 (Right)), Boolean_Type); when Iir_Predefined_Floating_Equality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Fp64 (Left) = Read_Fp64 (Right)), Boolean_Type); when Iir_Predefined_Floating_Inequality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Fp64 (Left) /= Read_Fp64 (Right)), Boolean_Type); when Iir_Predefined_Floating_Greater => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Fp64 (Left) > Read_Fp64 (Right)), Boolean_Type); when Iir_Predefined_Floating_Greater_Equal => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Fp64 (Left) >= Read_Fp64 (Right)), Boolean_Type); when Iir_Predefined_Floating_Plus => - return Create_Value_Float (Read_Fp64 (Left) + Read_Fp64 (Right), + return Create_Memory_Fp64 (Read_Fp64 (Left) + Read_Fp64 (Right), Res_Typ); when Iir_Predefined_Floating_Minus => - return Create_Value_Float (Read_Fp64 (Left) - Read_Fp64 (Right), + return Create_Memory_Fp64 (Read_Fp64 (Left) - Read_Fp64 (Right), Res_Typ); when Iir_Predefined_Floating_Mul => - return Create_Value_Float (Read_Fp64 (Left) * Read_Fp64 (Right), + return Create_Memory_Fp64 (Read_Fp64 (Left) * Read_Fp64 (Right), Res_Typ); when Iir_Predefined_Floating_Div => - return Create_Value_Float (Read_Fp64 (Left) / Read_Fp64 (Right), + return Create_Memory_Fp64 (Read_Fp64 (Left) / Read_Fp64 (Right), Res_Typ); when Iir_Predefined_Floating_Exp => - return Create_Value_Float + return Create_Memory_Fp64 (Read_Fp64 (Left) ** Natural (Read_Discrete (Right)), Res_Typ); when Iir_Predefined_Array_Array_Concat => @@ -617,20 +617,19 @@ package body Synth.Static_Oper is Iir_Index32 (Get_Bound_Length (Right.Typ, 1)); Bnd : Bound_Type; Res_Typ : Type_Acc; - Res : Valtyp; + Res : Memtyp; begin Bnd := Oper.Create_Bounds_From_Length (Syn_Inst, Get_Index_Type (Get_Type (Expr), 0), L_Len + R_Len); Res_Typ := Create_Onedimensional_Array_Subtype (Ret_Typ, Bnd); - Res := Create_Value_Memory (Res_Typ); + Res := Create_Memory (Res_Typ); if Left.Typ.Sz > 0 then - Copy_Memory (Res.Val.Mem, Left.Mem, Left.Typ.Sz); + Copy_Memory (Res.Mem, Left.Mem, Left.Typ.Sz); end if; if Right.Typ.Sz > 0 then - Copy_Memory (Res.Val.Mem + Left.Typ.Sz, - Right.Mem, Right.Typ.Sz); + Copy_Memory (Res.Mem + Left.Typ.Sz, Right.Mem, Right.Typ.Sz); end if; return Res; end; @@ -642,15 +641,15 @@ package body Synth.Static_Oper is Get_Array_Flat_Length (Right.Typ); Bnd : Bound_Type; Res_Typ : Type_Acc; - Res : Valtyp; + Res : Memtyp; begin Bnd := Oper.Create_Bounds_From_Length (Syn_Inst, Get_Index_Type (Get_Type (Expr), 0), 1 + Rlen); Res_Typ := Create_Onedimensional_Array_Subtype (Ret_Typ, Bnd); - Res := Create_Value_Memory (Res_Typ); - Copy_Memory (Res.Val.Mem, Left.Mem, Left.Typ.Sz); - Copy_Memory (Res.Val.Mem + Left.Typ.Sz, + Res := Create_Memory (Res_Typ); + Copy_Memory (Res.Mem, Left.Mem, Left.Typ.Sz); + Copy_Memory (Res.Mem + Left.Typ.Sz, Right.Mem, Right.Typ.Sz); return Res; end; @@ -661,34 +660,34 @@ package body Synth.Static_Oper is Llen : constant Iir_Index32 := Get_Array_Flat_Length (Left.Typ); Bnd : Bound_Type; Res_Typ : Type_Acc; - Res : Valtyp; + Res : Memtyp; begin Bnd := Oper.Create_Bounds_From_Length (Syn_Inst, Get_Index_Type (Get_Type (Expr), 0), Llen + 1); Res_Typ := Create_Onedimensional_Array_Subtype (Ret_Typ, Bnd); - Res := Create_Value_Memory (Res_Typ); - Copy_Memory (Res.Val.Mem, Left.Mem, Left.Typ.Sz); - Copy_Memory (Res.Val.Mem + Left.Typ.Sz, + Res := Create_Memory (Res_Typ); + Copy_Memory (Res.Mem, Left.Mem, Left.Typ.Sz); + Copy_Memory (Res.Mem + Left.Typ.Sz, Right.Mem, Right.Typ.Sz); return Res; end; when Iir_Predefined_Array_Equality | Iir_Predefined_Record_Equality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Is_Equal (Left, Right)), Boolean_Type); when Iir_Predefined_Array_Inequality | Iir_Predefined_Record_Inequality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (not Is_Equal (Left, Right)), Boolean_Type); when Iir_Predefined_Access_Equality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Access (Left) = Read_Access (Right)), Boolean_Type); when Iir_Predefined_Access_Inequality => - return Create_Value_Discrete + return Create_Memory_U8 (Boolean'Pos (Read_Access (Left) /= Read_Access (Right)), Boolean_Type); @@ -708,19 +707,19 @@ package body Synth.Static_Oper is return Synth_Vector_Dyadic (Left, Right, Xor_Table, Expr); when Iir_Predefined_Ieee_1164_Scalar_Or => - return Create_Value_Discrete + return Create_Memory_U8 (Std_Ulogic'Pos (Or_Table (Get_Static_Ulogic (Left), Get_Static_Ulogic (Right))), Res_Typ); when Iir_Predefined_Ieee_1164_Scalar_And => - return Create_Value_Discrete + return Create_Memory_U8 (Std_Ulogic'Pos (And_Table (Get_Static_Ulogic (Left), Get_Static_Ulogic (Right))), Res_Typ); when Iir_Predefined_Ieee_1164_Scalar_Xor => - return Create_Value_Discrete + return Create_Memory_U8 (Std_Ulogic'Pos (Xor_Table (Get_Static_Ulogic (Left), Get_Static_Ulogic (Right))), Res_Typ); @@ -731,7 +730,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Uns (Left, Right, Greater, Expr) = Equal; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Eq_Uns_Nat => declare @@ -739,7 +738,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Nat (Left, Right, Greater, Expr) = Equal; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Gt_Uns_Uns => @@ -748,7 +747,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Uns (Left, Right, Less, Expr) = Greater; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Gt_Nat_Uns => declare @@ -756,7 +755,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Nat_Uns (Left, Right, Less, Expr) = Greater; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Gt_Uns_Nat => declare @@ -764,7 +763,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Nat (Left, Right, Less, Expr) = Greater; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Le_Uns_Uns => @@ -773,7 +772,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Uns (Left, Right, Greater, Expr) <= Equal; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Le_Uns_Nat => declare @@ -781,7 +780,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Nat (Left, Right, Greater, Expr) <= Equal; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Lt_Uns_Uns => @@ -790,7 +789,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Uns (Left, Right, Greater, Expr) < Equal; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Lt_Uns_Nat => declare @@ -798,7 +797,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Uns_Nat (Left, Right, Greater, Expr) < Equal; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Lt_Nat_Uns => declare @@ -806,7 +805,7 @@ package body Synth.Static_Oper is begin Res := Synth_Compare_Nat_Uns (Left, Right, Greater, Expr) < Equal; - return Create_Value_Discrete (Boolean'Pos (Res), Res_Typ); + return Create_Memory_U8 (Boolean'Pos (Res), Res_Typ); end; when Iir_Predefined_Ieee_Numeric_Std_Add_Uns_Uns @@ -854,28 +853,28 @@ package body Synth.Static_Oper is Error_Msg_Synth (+Expr, "synth_static_dyadic_predefined: unhandled " & Iir_Predefined_Functions'Image (Def)); - return No_Valtyp; + return Null_Memtyp; end case; end Synth_Static_Dyadic_Predefined; - function Synth_Vector_Monadic (Vec : Memtyp; Op : Table_1d) return Valtyp + function Synth_Vector_Monadic (Vec : Memtyp; Op : Table_1d) return Memtyp is Len : constant Iir_Index32 := Vec_Length (Vec.Typ); - Res : Valtyp; + Res : Memtyp; begin - Res := Create_Value_Memory (Create_Res_Bound (Vec.Typ)); + Res := Create_Memory (Create_Res_Bound (Vec.Typ)); for I in 1 .. Uns32 (Len) loop declare V : constant Std_Ulogic := Read_Std_Logic (Vec.Mem, I - 1); begin - Write_Std_Logic (Res.Val.Mem, I - 1, Op (V)); + Write_Std_Logic (Res.Mem, I - 1, Op (V)); end; end loop; return Res; end Synth_Vector_Monadic; function Synth_Vector_Reduce - (Init : Std_Ulogic; Vec : Memtyp; Op : Table_2d) return Valtyp + (Init : Std_Ulogic; Vec : Memtyp; Op : Table_2d) return Memtyp is El_Typ : constant Type_Acc := Vec.Typ.Vec_El; Res : Std_Ulogic; @@ -889,13 +888,13 @@ package body Synth.Static_Oper is end; end loop; - return Create_Value_Discrete (Std_Ulogic'Pos (Res), El_Typ); + return Create_Memory_U8 (Std_Ulogic'Pos (Res), El_Typ); end Synth_Vector_Reduce; function Synth_Static_Monadic_Predefined (Syn_Inst : Synth_Instance_Acc; Imp : Node; Operand : Memtyp; - Expr : Node) return Valtyp + Expr : Node) return Memtyp is Def : constant Iir_Predefined_Functions := Get_Implicit_Definition (Imp); @@ -907,26 +906,25 @@ package body Synth.Static_Oper is case Def is when Iir_Predefined_Boolean_Not | Iir_Predefined_Bit_Not => - return Create_Value_Discrete - (1 - Read_Discrete (Operand), Oper_Typ); + return Create_Memory_U8 (1 - Read_U8 (Operand), Oper_Typ); when Iir_Predefined_Integer_Negation | Iir_Predefined_Physical_Negation => - return Create_Value_Discrete (-Read_Discrete (Operand), Oper_Typ); + return Create_Memory_Discrete (-Read_Discrete (Operand), Oper_Typ); when Iir_Predefined_Integer_Absolute | Iir_Predefined_Physical_Absolute => - return Create_Value_Discrete + return Create_Memory_Discrete (abs Read_Discrete(Operand), Oper_Typ); when Iir_Predefined_Integer_Identity | Iir_Predefined_Physical_Identity => - return Create_Value_Memory (Operand); + return Operand; when Iir_Predefined_Floating_Negation => - return Create_Value_Float (-Read_Fp64 (Operand), Oper_Typ); + return Create_Memory_Fp64 (-Read_Fp64 (Operand), Oper_Typ); when Iir_Predefined_Floating_Identity => - return Create_Value_Memory (Operand); + return Operand; when Iir_Predefined_Floating_Absolute => - return Create_Value_Float (abs Read_Fp64 (Operand), Oper_Typ); + return Create_Memory_Fp64 (abs Read_Fp64 (Operand), Oper_Typ); when Iir_Predefined_Ieee_1164_Condition_Operator => -- Constant std_logic: need to convert. @@ -934,8 +932,8 @@ package body Synth.Static_Oper is Val : Uns32; Zx : Uns32; begin - From_Std_Logic (Read_Discrete (Operand), Val, Zx); - return Create_Value_Discrete + From_Std_Logic (Int64 (Read_U8 (Operand)), Val, Zx); + return Create_Memory_U8 (Boolean'Pos (Val = 1 and Zx = 0), Boolean_Type); end; @@ -948,7 +946,7 @@ package body Synth.Static_Oper is declare Res_Arr : constant Std_Logic_Vector := Neg_Sgn (Op_Arr); begin - return To_Valtyp (Res_Arr, Operand.Typ.Vec_El); + return To_Memtyp (Res_Arr, Operand.Typ.Vec_El); end; end; @@ -958,7 +956,7 @@ package body Synth.Static_Oper is return Synth_Vector_Monadic (Operand, Not_Table); when Iir_Predefined_Ieee_1164_Scalar_Not => - return Create_Value_Discrete + return Create_Memory_U8 (Std_Ulogic'Pos (Not_Table (Read_Std_Logic (Operand.Mem, 0))), Oper_Typ); @@ -1114,7 +1112,6 @@ package body Synth.Static_Oper is when Iir_Predefined_Ieee_1164_To_Stdlogicvector_Bv => declare - use Grt.Types; El_Type : constant Type_Acc := Get_Array_Element (Res_Typ); Res : Valtyp; Bnd : Type_Acc; diff --git a/src/synth/synth-static_oper.ads b/src/synth/synth-static_oper.ads index d1c9458e0..fc7ec6db7 100644 --- a/src/synth/synth-static_oper.ads +++ b/src/synth/synth-static_oper.ads @@ -28,11 +28,11 @@ package Synth.Static_Oper is Imp : Node; Left : Memtyp; Right : Memtyp; - Expr : Node) return Valtyp; + Expr : Node) return Memtyp; function Synth_Static_Monadic_Predefined (Syn_Inst : Synth_Instance_Acc; Imp : Node; Operand : Memtyp; - Expr : Node) return Valtyp; + Expr : Node) return Memtyp; function Synth_Static_Predefined_Function_Call (Subprg_Inst : Synth_Instance_Acc; Expr : Node) return Valtyp; diff --git a/src/synth/synth-values.adb b/src/synth/synth-values.adb index 4cda711c6..b72693243 100644 --- a/src/synth/synth-values.adb +++ b/src/synth/synth-values.adb @@ -20,7 +20,8 @@ with Ada.Unchecked_Conversion; with System; -with System.Storage_Elements; + +with Grt.Types; use Grt.Types; with Vhdl.Nodes; use Vhdl.Nodes; @@ -112,6 +113,17 @@ package body Synth.Values is return Is_Equal (Get_Memtyp (L), Get_Memtyp (R)); end Is_Equal; + function Create_Value_Memtyp (Mt : Memtyp) return Valtyp + is + subtype Value_Type_Memory is Value_Type (Value_Memory); + function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Memory); + Res : Value_Acc; + begin + Res := To_Value_Acc (Alloc (Current_Pool, (Kind => Value_Memory, + Mem => Mt.Mem))); + return (Mt.Typ, Res); + end Create_Value_Memtyp; + function Create_Value_Wire (W : Wire_Id) return Value_Acc is subtype Value_Type_Wire is Value_Type (Values.Value_Wire); @@ -312,81 +324,6 @@ package body Synth.Values is return Res; end Unshare; - type Ghdl_U8_Ptr is access all Ghdl_U8; - function To_U8_Ptr is - new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_U8_Ptr); - - procedure Write_U8 (Mem : Memory_Ptr; Val : Ghdl_U8) is - begin - To_U8_Ptr (Mem).all := Val; - end Write_U8; - - function Read_U8 (Mem : Memory_Ptr) return Ghdl_U8 is - begin - return To_U8_Ptr (Mem).all; - end Read_U8; - - type Ghdl_I32_Ptr is access all Ghdl_I32; - function To_I32_Ptr is - new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_I32_Ptr); - - procedure Write_I32 (Mem : Memory_Ptr; Val : Ghdl_I32) is - begin - To_I32_Ptr (Mem).all := Val; - end Write_I32; - - function Read_I32 (Mem : Memory_Ptr) return Ghdl_I32 is - begin - return To_I32_Ptr (Mem).all; - end Read_I32; - - type Ghdl_U32_Ptr is access all Ghdl_U32; - function To_U32_Ptr is - new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_U32_Ptr); - - procedure Write_U32 (Mem : Memory_Ptr; Val : Ghdl_U32) is - begin - To_U32_Ptr (Mem).all := Val; - end Write_U32; - - function Read_U32 (Mem : Memory_Ptr) return Ghdl_U32 is - begin - return To_U32_Ptr (Mem).all; - end Read_U32; - - type Ghdl_I64_Ptr is access all Ghdl_I64; - function To_I64_Ptr is - new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_I64_Ptr); - - procedure Write_I64 (Mem : Memory_Ptr; Val : Ghdl_I64) is - begin - To_I64_Ptr (Mem).all := Val; - end Write_I64; - - function Read_I64 (Mem : Memory_Ptr) return Ghdl_I64 is - begin - return To_I64_Ptr (Mem).all; - end Read_I64; - - type Fp64_Ptr is access all Fp64; - function To_Fp64_Ptr is - new Ada.Unchecked_Conversion (Memory_Ptr, Fp64_Ptr); - - procedure Write_Fp64 (Mem : Memory_Ptr; Val : Fp64) is - begin - To_Fp64_Ptr (Mem).all := Val; - end Write_Fp64; - - function Read_Fp64 (Mem : Memory_Ptr) return Fp64 is - begin - return To_Fp64_Ptr (Mem).all; - end Read_Fp64; - - function Read_Fp64 (Mt : Memtyp) return Fp64 is - begin - return Read_Fp64 (Mt.Mem); - end Read_Fp64; - type Heap_Index_Ptr is access all Heap_Index; function To_Heap_Index_Ptr is new Ada.Unchecked_Conversion (Memory_Ptr, Heap_Index_Ptr); @@ -406,51 +343,11 @@ package body Synth.Values is return Read_Access (Mt.Mem); end Read_Access; - function "+" (Base : Memory_Ptr; Off : Size_Type) return Memory_Ptr - is - use System.Storage_Elements; - - function To_Address is new Ada.Unchecked_Conversion - (Memory_Ptr, System.Address); - function To_Memory_Ptr is new Ada.Unchecked_Conversion - (System.Address, Memory_Ptr); - begin - return To_Memory_Ptr (To_Address (Base) + Storage_Offset (Off)); - end "+"; - - procedure Write_Discrete (Mem : Memory_Ptr; Typ : Type_Acc; Val : Int64) is - begin - case Typ.Sz is - when 1 => - Write_U8 (Mem, Ghdl_U8 (Val)); - when 4 => - Write_I32 (Mem, Ghdl_I32 (Val)); - when 8 => - Write_I64 (Mem, Ghdl_I64 (Val)); - when others => - raise Internal_Error; - end case; - end Write_Discrete; - procedure Write_Discrete (Vt : Valtyp; Val : Int64) is begin Write_Discrete (Vt.Val.Mem, Vt.Typ, Val); end Write_Discrete; - function Read_Discrete (Mt : Memtyp) return Int64 is - begin - case Mt.Typ.Sz is - when 1 => - return Int64 (Read_U8 (Mt.Mem)); - when 4 => - return Int64 (Read_I32 (Mt.Mem)); - when 8 => - return Int64 (Read_I64 (Mt.Mem)); - when others => - raise Internal_Error; - end case; - end Read_Discrete; - function Read_Discrete (Vt : Valtyp) return Int64 is begin return Read_Discrete (Get_Memtyp (Vt)); @@ -513,8 +410,6 @@ package body Synth.Values is return Res; end Create_Value_Uns; - pragma Unreferenced (Read_U32); - function Create_Value_Int (Val : Int64; Vtype : Type_Acc) return Valtyp is Res : Valtyp; diff --git a/src/synth/synth-values.ads b/src/synth/synth-values.ads index 8da1d74cd..e90bbedbc 100644 --- a/src/synth/synth-values.ads +++ b/src/synth/synth-values.ads @@ -23,7 +23,6 @@ with Ada.Unchecked_Deallocation; with Types; use Types; with Areapools; use Areapools; -with Grt.Types; use Grt.Types; with Grt.Files_Operations; with Netlists; use Netlists; @@ -113,6 +112,8 @@ package Synth.Values is function Is_Equal (L, R : Valtyp) return Boolean; function Is_Equal (L, R : Memtyp) return Boolean; + function Create_Value_Memtyp (Mt : Memtyp) return Valtyp; + -- Create a Value_Net. function Create_Value_Net (N : Net; Ntype : Type_Acc) return Valtyp; @@ -164,23 +165,14 @@ package Synth.Values is -- Memory access. procedure Write_Discrete (Vt : Valtyp; Val : Int64); - function Read_Discrete (Mt : Memtyp) return Int64; function Read_Discrete (Vt : Valtyp) return Int64; procedure Write_Access (Mem : Memory_Ptr; Val : Heap_Index); - function Read_Access (Vt : Valtyp) return Heap_Index; function Read_Access (Mt : Memtyp) return Heap_Index; + function Read_Access (Vt : Valtyp) return Heap_Index; - function Read_Fp64 (Mem : Memory_Ptr) return Fp64; - function Read_Fp64 (Mt : Memtyp) return Fp64; function Read_Fp64 (Vt : Valtyp) return Fp64; - -- Low level subprograms. - function Read_U8 (Mem : Memory_Ptr) return Ghdl_U8; - procedure Write_U8 (Mem : Memory_Ptr; Val : Ghdl_U8); - - function "+" (Base : Memory_Ptr; Off : Size_Type) return Memory_Ptr; - procedure Copy_Memory (Dest : Memory_Ptr; Src : Memory_Ptr; Sz : Size_Type); procedure Write_Value (Dest : Memory_Ptr; Vt : Valtyp); end Synth.Values; |