diff options
-rw-r--r-- | src/synth/netlists-builders.adb | 8 | ||||
-rw-r--r-- | src/synth/synth-context.adb | 8 | ||||
-rw-r--r-- | src/synth/synth-stmts.adb | 42 | ||||
-rw-r--r-- | src/synth/synth-values.adb | 19 | ||||
-rw-r--r-- | src/synth/synth-values.ads | 10 |
5 files changed, 32 insertions, 55 deletions
diff --git a/src/synth/netlists-builders.adb b/src/synth/netlists-builders.adb index 0dbf202f4..4b3ddae4f 100644 --- a/src/synth/netlists-builders.adb +++ b/src/synth/netlists-builders.adb @@ -770,9 +770,9 @@ package body Netlists.Builders is Sel : Net; I0, I1 : Net) return Net is - Wd : constant Width := Get_Width (I0); + Wd : constant Width := Get_Width (I1); pragma Assert (Wd /= No_Width); - pragma Assert (Get_Width (I1) = Wd); + pragma Assert (I0 = No_Net or else Get_Width (I0) = Wd); pragma Assert (Get_Width (Sel) = 1); Inst : Instance; O : Net; @@ -781,7 +781,9 @@ package body Netlists.Builders is O := Get_Output (Inst, 0); Set_Width (O, Wd); Connect (Get_Input (Inst, 0), Sel); - Connect (Get_Input (Inst, 1), I0); + if I0 /= No_Net then + Connect (Get_Input (Inst, 1), I0); + end if; Connect (Get_Input (Inst, 2), I1); return O; end Build_Mux2; diff --git a/src/synth/synth-context.adb b/src/synth/synth-context.adb index bced2e633..e0fdc5e76 100644 --- a/src/synth/synth-context.adb +++ b/src/synth/synth-context.adb @@ -366,14 +366,6 @@ package body Synth.Context is return Get_Current_Value (Build_Context, Val.W); when Value_Net => return Val.N; - when Value_Mux2 => - declare - Cond : constant Net := Get_Net (Val.M_Cond); - begin - return Build_Mux2 (Ctxt => Build_Context, Sel => Cond, - I0 => Get_Net (Val.M_F), - I1 => Get_Net (Val.M_T)); - end; when Value_Discrete => case Val.Typ.Kind is when Type_Bit => diff --git a/src/synth/synth-stmts.adb b/src/synth/synth-stmts.adb index cc8ae6da3..647cd0184 100644 --- a/src/synth/synth-stmts.adb +++ b/src/synth/synth-stmts.adb @@ -331,27 +331,33 @@ package body Synth.Stmts is Cond : Node; Cwf : Node; Val, Cond_Val : Value_Acc; - First, Last : Value_Acc; + First, Last : Net; + V : Net; begin - Last := null; + Last := No_Net; Cwf := Get_Conditional_Waveform_Chain (Stmt); while Cwf /= Null_Node loop Val := Synth_Waveform (Syn_Inst, Get_Waveform_Chain (Cwf), Targ_Type); + V := Get_Net (Val); Cond := Get_Condition (Cwf); if Cond /= Null_Node then Cond_Val := Synth_Expression (Syn_Inst, Cond); - Val := Create_Value_Mux2 (Cond_Val, Val, null); + V := Build_Mux2 (Build_Context, + Get_Net (Cond_Val), + No_Net, V); + Set_Location (V, Cwf); end if; - if Last /= null then - Last.M_F := Val; + if Last /= No_Net then + Connect (Get_Input (Get_Net_Parent (Last), 1), V); else - First := Val; + First := V; end if; - Last := Val; + Last := V; Cwf := Get_Chain (Cwf); end loop; - Synth_Assignment (Syn_Inst, Target, First, Stmt); + Val := Create_Value_Net (First, Get_Value_Type (Syn_Inst, Targ_Type)); + Synth_Assignment (Syn_Inst, Target, Val, Stmt); end Synth_Conditional_Signal_Assignment; procedure Synth_Variable_Assignment @@ -373,28 +379,32 @@ package body Synth.Stmts is Cond : Node; Ce : Node; Val, Cond_Val : Value_Acc; - First, Last : Value_Acc; + V : Net; + First, Last : Net; begin - Last := null; + Last := No_Net; Ce := Get_Conditional_Expression_Chain (Stmt); while Ce /= Null_Node loop Val := Synth_Expression_With_Type (Syn_Inst, Get_Expression (Ce), Targ_Type); + V := Get_Net (Val); Cond := Get_Condition (Ce); if Cond /= Null_Node then Cond_Val := Synth_Expression (Syn_Inst, Cond); - Val := Create_Value_Mux2 (Cond_Val, Val, null); + V := Build_Mux2 (Build_Context, Get_Net (Cond_Val), No_Net, V); + Set_Location (V, Ce); end if; - if Last /= null then - Last.M_F := Val; + if Last /= No_Net then + Connect (Get_Input (Get_Net_Parent (Last), 1), V); else - First := Val; + First := V; end if; - Last := Val; + Last := V; Ce := Get_Chain (Ce); end loop; - Synth_Assignment (Syn_Inst, Target, First, Stmt); + Val := Create_Value_Net (First, Get_Value_Type (Syn_Inst, Targ_Type)); + Synth_Assignment (Syn_Inst, Target, Val, Stmt); end Synth_Conditional_Variable_Assignment; procedure Synth_If_Statement (C : in out Seq_Context; Stmt : Node) diff --git a/src/synth/synth-values.adb b/src/synth/synth-values.adb index 08a1daa36..223aeb5cb 100644 --- a/src/synth/synth-values.adb +++ b/src/synth/synth-values.adb @@ -46,8 +46,7 @@ package body Synth.Values is | Value_Float => return True; when Value_Net - | Value_Wire - | Value_Mux2 => + | Value_Wire => return False; when Value_Const_Array | Value_Const_Record => @@ -73,8 +72,6 @@ package body Synth.Values is return Netlists.Utils.Is_Const_Net (Val.N); when Value_Wire => return Is_Const_Wire (Val.W); - when Value_Mux2 => - return False; when Value_Const_Array | Value_Const_Record => return True; @@ -350,20 +347,6 @@ package body Synth.Values is Value_Type_Net'(Kind => Value_Net, N => N, Typ => Ntype))); end Create_Value_Net; - function Create_Value_Mux2 (Cond : Value_Acc; T : Value_Acc; F : Value_Acc) - return Value_Acc - is - subtype Value_Type_Mux2 is Value_Type (Value_Mux2); - function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Mux2); - pragma Assert (F = null or else T.Typ = F.Typ); - begin - return To_Value_Acc - (Alloc (Current_Pool, - (Kind => Value_Mux2, - Typ => T.Typ, - M_Cond => Cond, M_T => T, M_F => F))); - end Create_Value_Mux2; - function Create_Value_Discrete (Val : Int64; Vtype : Type_Acc) return Value_Acc is diff --git a/src/synth/synth-values.ads b/src/synth/synth-values.ads index 7c1de0ad9..81565e1fc 100644 --- a/src/synth/synth-values.ads +++ b/src/synth/synth-values.ads @@ -137,8 +137,6 @@ package Synth.Values is -- into a net. Value_Wire, - Value_Mux2, - -- A discrete value (integer or enumeration). Value_Discrete, @@ -184,10 +182,6 @@ package Synth.Values is N : Net; when Value_Wire => W : Wire_Id; - when Value_Mux2 => - M_Cond : Value_Acc; - M_T : Value_Acc; - M_F : Value_Acc; when Value_Discrete => Scal : Int64; when Value_Float => @@ -253,10 +247,6 @@ package Synth.Values is -- Create a Value_Wire. For a bit wire, RNG must be null. function Create_Value_Wire (W : Wire_Id; Wtype : Type_Acc) return Value_Acc; - -- Create a mux2. - function Create_Value_Mux2 (Cond : Value_Acc; T : Value_Acc; F : Value_Acc) - return Value_Acc; - function Create_Value_Discrete (Val : Int64; Vtype : Type_Acc) return Value_Acc; |