From 67333b39047b444ea93f1efcabf7ea7b0371a972 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Sun, 8 Sep 2019 07:49:53 +0200 Subject: synth: handle alias (WIP, read only). --- src/synth/synth-context.adb | 8 ++++++++ src/synth/synth-decls.adb | 19 +++++++++++++++++-- src/synth/synth-expr.adb | 3 ++- src/synth/synth-stmts.adb | 37 +++++++++++++++++++++++++++++-------- src/synth/synth-stmts.ads | 7 +++++++ src/synth/synth-values.adb | 13 +++++++++++++ src/synth/synth-values.ads | 11 ++++++++++- 7 files changed, 86 insertions(+), 12 deletions(-) (limited to 'src/synth') diff --git a/src/synth/synth-context.adb b/src/synth/synth-context.adb index 48a0114b3..d7af882b5 100644 --- a/src/synth/synth-context.adb +++ b/src/synth/synth-context.adb @@ -436,6 +436,14 @@ package body Synth.Context is Build (Build_Context, C, Res); return Res; end; + when Value_Alias => + declare + Res : Net; + begin + Res := Get_Current_Value (Build_Context, Val.A_Wid); + return Build_Extract (Build_Context, Res, Val.A_Off, + Get_Type_Width (Val.Typ)); + end; when others => raise Internal_Error; end case; diff --git a/src/synth/synth-decls.adb b/src/synth/synth-decls.adb index 2382558bd..d411ded68 100644 --- a/src/synth/synth-decls.adb +++ b/src/synth/synth-decls.adb @@ -22,14 +22,17 @@ with Types; use Types; with Mutils; use Mutils; with Netlists; use Netlists; with Netlists.Builders; use Netlists.Builders; + with Vhdl.Errors; use Vhdl.Errors; with Vhdl.Utils; use Vhdl.Utils; -with Vhdl.Ieee.Std_Logic_1164; with Vhdl.Std_Package; +with Vhdl.Ieee.Std_Logic_1164; +with Vhdl.Annotations; use Vhdl.Annotations; + with Synth.Values; use Synth.Values; with Synth.Environment; use Synth.Environment; with Synth.Expr; use Synth.Expr; -with Vhdl.Annotations; use Vhdl.Annotations; +with Synth.Stmts; package body Synth.Decls is procedure Synth_Anonymous_Subtype_Indication @@ -464,6 +467,18 @@ package body Synth.Decls is end if; Create_Var_Wire (Syn_Inst, Decl, Init); end; + when Iir_Kind_Object_Alias_Declaration => + Synth_Declaration_Type (Syn_Inst, Decl); + declare + Wid : Wire_Id; + Off : Uns32; + Typ : Type_Acc; + begin + Stmts.Synth_Assignment_Prefix (Syn_Inst, Get_Name (Decl), + Wid, Off, Typ); + Create_Object (Syn_Inst, Decl, + Create_Value_Alias (Wid, Off, Typ)); + end; when Iir_Kind_Anonymous_Signal_Declaration => Make_Object (Syn_Inst, Wire_Signal, Decl); Create_Var_Wire (Syn_Inst, Decl, null); diff --git a/src/synth/synth-expr.adb b/src/synth/synth-expr.adb index da6ea7190..d0abeec7b 100644 --- a/src/synth/synth-expr.adb +++ b/src/synth/synth-expr.adb @@ -1532,7 +1532,8 @@ package body Synth.Expr is | Iir_Kind_Anonymous_Signal_Declaration | Iir_Kind_Interface_Constant_Declaration | Iir_Kind_Constant_Declaration - | Iir_Kind_Iterator_Declaration => + | Iir_Kind_Iterator_Declaration + | Iir_Kind_Object_Alias_Declaration => return Get_Value (Syn_Inst, Name); when Iir_Kind_Enumeration_Literal => return Create_Value_Discrete diff --git a/src/synth/synth-stmts.adb b/src/synth/synth-stmts.adb index a97a00558..a651f5e07 100644 --- a/src/synth/synth-stmts.adb +++ b/src/synth/synth-stmts.adb @@ -39,7 +39,6 @@ with Synth.Types; use Synth.Types; with Synth.Errors; use Synth.Errors; with Synth.Decls; use Synth.Decls; with Synth.Expr; use Synth.Expr; -with Synth.Environment; use Synth.Environment; with Synth.Insts; use Synth.Insts; with Synth.Source; @@ -121,14 +120,13 @@ package body Synth.Stmts is procedure Synth_Assignment_Prefix (Syn_Inst : Synth_Instance_Acc; Pfx : Node; - Loc : Node; Dest_Wid : out Wire_Id; Dest_Off : out Uns32; Dest_Type : out Type_Acc) is begin case Get_Kind (Pfx) is when Iir_Kind_Simple_Name => - Synth_Assignment_Prefix (Syn_Inst, Get_Named_Entity (Pfx), Loc, + Synth_Assignment_Prefix (Syn_Inst, Get_Named_Entity (Pfx), Dest_Wid, Dest_Off, Dest_Type); when Iir_Kind_Interface_Signal_Declaration | Iir_Kind_Variable_Declaration @@ -148,7 +146,7 @@ package body Synth.Stmts is Off : Uns32; W : Width; begin - Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Pfx), Loc, + Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Pfx), Dest_Wid, Dest_Off, Dest_Type); Synth_Indexed_Name (Syn_Inst, Pfx, Dest_Type, Voff, Mul, Off, W); @@ -171,12 +169,35 @@ package body Synth.Stmts is Idx : constant Iir_Index32 := Get_Element_Position (Get_Named_Entity (Pfx)); begin - Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Pfx), Loc, + Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Pfx), Dest_Wid, Dest_Off, Dest_Type); Dest_Off := Dest_Off + Dest_Type.Rec.E (Idx + 1).Off; Dest_Type := Dest_Type.Rec.E (Idx + 1).Typ; end; + when Iir_Kind_Slice_Name => + declare + Res_Bnd : Bound_Type; + Inp : Net; + Step : Uns32; + Sl_Off : Int32; + Wd : Uns32; + begin + Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Pfx), + Dest_Wid, Dest_Off, Dest_Type); + Synth_Slice_Suffix (Syn_Inst, Pfx, Dest_Type.Vbound, + Res_Bnd, Inp, Step, Sl_Off, Wd); + + if Inp /= No_Net then + Error_Msg_Synth + (+Pfx, "dynamic index must be the last suffix"); + return; + end if; + + Dest_Type := Create_Vector_Type (Res_Bnd, Dest_Type.Vec_El); + Dest_Off := Dest_Off + Uns32 (Sl_Off); + end; + when others => Error_Kind ("synth_assignment_prefix", Pfx); end case; @@ -201,7 +222,7 @@ package body Synth.Stmts is Off : Uns32; Typ : Type_Acc; begin - Synth_Assignment_Prefix (Syn_Inst, Target, Loc, Wid, Off, Typ); + Synth_Assignment_Prefix (Syn_Inst, Target, Wid, Off, Typ); Synth_Assign (Wid, Typ, Val, Off, Loc); end; when Iir_Kind_Indexed_Name => @@ -218,7 +239,7 @@ package body Synth.Stmts is Targ_Net : Net; V : Net; begin - Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Target), Loc, + Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Target), Wid, Off, Typ); Synth_Indexed_Name (Syn_Inst, Target, Typ, Voff, Mul, Idx_Off, W); @@ -254,7 +275,7 @@ package body Synth.Stmts is Res_Type : Type_Acc; V : Net; begin - Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Target), Loc, + Synth_Assignment_Prefix (Syn_Inst, Get_Prefix (Target), Wid, Off, Typ); Synth_Slice_Suffix (Syn_Inst, Target, Typ.Vbound, Res_Bnd, Inp, Step, Sl_Off, Wd); diff --git a/src/synth/synth-stmts.ads b/src/synth/synth-stmts.ads index cdd26e8eb..884ea299b 100644 --- a/src/synth/synth-stmts.ads +++ b/src/synth/synth-stmts.ads @@ -22,6 +22,7 @@ with Types; use Types; with Vhdl.Nodes; use Vhdl.Nodes; with Synth.Values; use Synth.Values; with Synth.Context; use Synth.Context; +with Synth.Environment; use Synth.Environment; package Synth.Stmts is procedure Synth_Subprogram_Association (Subprg_Inst : Synth_Instance_Acc; @@ -29,6 +30,12 @@ package Synth.Stmts is Inter_Chain : Node; Assoc_Chain : Node); + procedure Synth_Assignment_Prefix (Syn_Inst : Synth_Instance_Acc; + Pfx : Node; + Dest_Wid : out Wire_Id; + Dest_Off : out Uns32; + Dest_Type : out Type_Acc); + procedure Synth_Assignment (Syn_Inst : Synth_Instance_Acc; Target : Node; Val : Value_Acc; diff --git a/src/synth/synth-values.adb b/src/synth/synth-values.adb index ded8e6a1b..6265a64dd 100644 --- a/src/synth/synth-values.adb +++ b/src/synth/synth-values.adb @@ -401,6 +401,19 @@ package body Synth.Values is (Kind => Value_Subtype, Typ => Typ))); end Create_Value_Subtype; + function Create_Value_Alias (Wid : Wire_Id; Off : Uns32; Typ : Type_Acc) + return Value_Acc + is + subtype Value_Type_Alias is Value_Type (Value_Alias); + function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Alias); + begin + return To_Value_Acc (Alloc (Current_Pool, + (Kind => Value_Alias, + A_Wid => Wid, + A_Off => Off, + Typ => Typ))); + end Create_Value_Alias; + function Copy (Src: in Value_Acc) return Value_Acc is Res: Value_Acc; diff --git a/src/synth/synth-values.ads b/src/synth/synth-values.ads index e7d5acc20..a0db0f5fb 100644 --- a/src/synth/synth-values.ads +++ b/src/synth/synth-values.ads @@ -147,7 +147,10 @@ package Synth.Values is -- A package. Value_Instance, - -- A subtype. + -- An alias + Value_Alias, + + -- A subtype. Contains only a type. Value_Subtype ); @@ -191,6 +194,9 @@ package Synth.Values is Rec : Value_Array_Acc; when Value_Instance => Instance : Instance_Id; + when Value_Alias => + A_Wid : Wire_Id; + A_Off : Uns32; end case; end record; @@ -262,6 +268,9 @@ package Synth.Values is function Create_Value_Instance (Inst : Instance_Id) return Value_Acc; + function Create_Value_Alias (Wid : Wire_Id; Off : Uns32; Typ : Type_Acc) + return Value_Acc; + function Unshare (Src : Value_Acc; Pool : Areapool_Acc) return Value_Acc; -- cgit v1.2.3