diff options
| author | Tristan Gingold <tgingold@free.fr> | 2019-09-01 11:03:38 +0200 | 
|---|---|---|
| committer | Tristan Gingold <tgingold@free.fr> | 2019-09-02 20:40:56 +0200 | 
| commit | 0dd21ac4324d3541fc223989205469e2b46d49bf (patch) | |
| tree | a8a0018a65d1998dea5ce3715ec2267741852371 /src | |
| parent | fdd89d0259d35d76c56770c74f6ffee8b5ebf239 (diff) | |
| download | ghdl-0dd21ac4324d3541fc223989205469e2b46d49bf.tar.gz ghdl-0dd21ac4324d3541fc223989205469e2b46d49bf.tar.bz2 ghdl-0dd21ac4324d3541fc223989205469e2b46d49bf.zip | |
synth: handle conditional variable assignment.
Diffstat (limited to 'src')
| -rw-r--r-- | src/synth/synth-stmts.adb | 34 | 
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 => | 
