aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/synth/netlists-builders.adb8
-rw-r--r--src/synth/synth-context.adb8
-rw-r--r--src/synth/synth-stmts.adb42
-rw-r--r--src/synth/synth-values.adb19
-rw-r--r--src/synth/synth-values.ads10
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;