aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2019-09-01 11:03:38 +0200
committerTristan Gingold <tgingold@free.fr>2019-09-02 20:40:56 +0200
commit0dd21ac4324d3541fc223989205469e2b46d49bf (patch)
treea8a0018a65d1998dea5ce3715ec2267741852371
parentfdd89d0259d35d76c56770c74f6ffee8b5ebf239 (diff)
downloadghdl-0dd21ac4324d3541fc223989205469e2b46d49bf.tar.gz
ghdl-0dd21ac4324d3541fc223989205469e2b46d49bf.tar.bz2
ghdl-0dd21ac4324d3541fc223989205469e2b46d49bf.zip
synth: handle conditional variable assignment.
-rw-r--r--src/synth/synth-stmts.adb34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/synth/synth-stmts.adb b/src/synth/synth-stmts.adb
index c36400e91..dc61e4ce9 100644
--- a/src/synth/synth-stmts.adb
+++ b/src/synth/synth-stmts.adb
@@ -341,6 +341,38 @@ package body Synth.Stmts is
Synth_Assignment (Syn_Inst, Target, Val, Stmt);
end Synth_Variable_Assignment;
+ procedure Synth_Conditional_Variable_Assignment
+ (Syn_Inst : Synth_Instance_Acc; Stmt : Node)
+ is
+ Target : constant Node := Get_Target (Stmt);
+ Targ_Type : constant Node := Get_Type (Target);
+ Cond : Node;
+ Ce : Node;
+ Val, Cond_Val : Value_Acc;
+ First, Last : Value_Acc;
+ begin
+ Last := null;
+ Ce := Get_Conditional_Expression_Chain (Stmt);
+ while Ce /= Null_Node loop
+ Val := Synth_Expression_With_Type
+ (Syn_Inst, Get_Expression (Ce), Targ_Type);
+ Cond := Get_Condition (Ce);
+ if Cond /= Null_Node then
+ Cond_Val := Synth_Expression (Syn_Inst, Cond);
+ Val := Create_Value_Mux2 (Cond_Val, Val, null);
+ end if;
+
+ if Last /= null then
+ Last.M_F := Val;
+ else
+ First := Val;
+ end if;
+ Last := Val;
+ Ce := Get_Chain (Ce);
+ end loop;
+ Synth_Assignment (Syn_Inst, Target, First, Stmt);
+ end Synth_Conditional_Variable_Assignment;
+
procedure Synth_If_Statement
(Syn_Inst : Synth_Instance_Acc; Stmt : Node)
is
@@ -1216,6 +1248,8 @@ package body Synth.Stmts is
Synth_Conditional_Signal_Assignment (Syn_Inst, Stmt);
when Iir_Kind_Variable_Assignment_Statement =>
Synth_Variable_Assignment (Syn_Inst, Stmt);
+ when Iir_Kind_Conditional_Variable_Assignment_Statement =>
+ Synth_Conditional_Variable_Assignment (Syn_Inst, Stmt);
when Iir_Kind_Case_Statement =>
Synth_Case_Statement (Syn_Inst, Stmt);
when Iir_Kind_For_Loop_Statement =>