diff options
Diffstat (limited to 'src/vhdl/translate/trans-chap4.adb')
-rw-r--r-- | src/vhdl/translate/trans-chap4.adb | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/src/vhdl/translate/trans-chap4.adb b/src/vhdl/translate/trans-chap4.adb index b496be745..ba95730a1 100644 --- a/src/vhdl/translate/trans-chap4.adb +++ b/src/vhdl/translate/trans-chap4.adb @@ -2634,6 +2634,8 @@ package body Trans.Chap4 is Res : Mnode; Imp : Iir; Func : Iir; + Obj : Iir; -- Method object for function conversion + Obj_Type : Iir; -- Valid only if OBJ is valid begin case Mode is when Conv_Mode_In => @@ -2661,6 +2663,15 @@ package body Trans.Chap4 is Out_Info := Get_Info (Out_Type); In_Info := Get_Info (In_Type); + if Get_Kind (Imp) = Iir_Kind_Function_Call then + Obj := Get_Method_Object (Imp); + if Is_Valid (Obj) then + Obj_Type := Get_Type (Obj); + end if; + else + Obj := Null_Iir; + end if; + -- Start record containing data for the conversion function. Start_Record_Type (El_List); @@ -2690,6 +2701,14 @@ package body Trans.Chap4 is Conv_Info.Instantiated_Field := O_Fnode_Null; end if; + if Obj /= Null_Iir then + New_Record_Field + (El_List, Conv_Info.Method_Object, Get_Identifier ("obj"), + Get_Info (Obj_Type).Ortho_Ptr_Type (Mode_Value)); + else + Conv_Info.Method_Object := O_Fnode_Null; + end if; + -- Add inputs, which is a pointer to the signal. New_Record_Field (El_List, Conv_Info.In_Sig_Field, Get_Identifier ("sig_in"), @@ -2816,8 +2835,17 @@ package body Trans.Chap4 is New_Association (Constr, M2E (Res)); end if; - Subprgs.Add_Subprg_Instance_Assoc - (Constr, Subprg_Info.Subprg_Instance); + if Obj /= Null_Iir then + -- Protected object. + New_Association + (Constr, + New_Value (New_Selected_Acc_Value + (New_Obj (Var_Data), + Conv_Info.Method_Object))); + else + Subprgs.Add_Subprg_Instance_Assoc + (Constr, Subprg_Info.Subprg_Instance); + end if; New_Association (Constr, R); @@ -2923,6 +2951,7 @@ package body Trans.Chap4 is procedure Elab_Conversion (Sig_In : Iir; Sig_Out : Iir; + Conv : Iir; Reg_Subprg : O_Dnode; Info : Assoc_Conv_Info; Dest_Sig : out Mnode) @@ -2969,11 +2998,19 @@ package body Trans.Chap4 is end if; New_Assign_Stmt (New_Selected_Acc_Value (New_Obj (Var_Data), - Info.Instantiated_Field), + Info.Instantiated_Field), Inst_Addr); end; end if; + if Info.Method_Object /= O_Fnode_Null then + New_Assign_Stmt + (New_Selected_Acc_Value (New_Obj (Var_Data), + Info.Method_Object), + M2E (Chap6.Translate_Name + (Get_Method_Object (Conv), Mode_Value))); + end if; + -- Set input. Chap6.Translate_Signal_Name (Sig_In, Src_Sig, Src_Val); Src_Sig := Stabilize (Src_Sig, True); @@ -3048,7 +3085,7 @@ package body Trans.Chap4 is Assoc_Info : constant Assoc_Info_Acc := Get_Info (Assoc); begin Elab_Conversion - (Get_Actual (Assoc), Formal, + (Get_Actual (Assoc), Formal, Get_In_Conversion (Assoc), Ghdl_Signal_In_Conversion, Assoc_Info.Assoc_In, Ndest); end Elab_In_Conversion; @@ -3060,7 +3097,7 @@ package body Trans.Chap4 is Assoc_Info : constant Assoc_Info_Acc := Get_Info (Assoc); begin Elab_Conversion - (Formal, Get_Actual (Assoc), + (Formal, Get_Actual (Assoc), Get_Out_Conversion (Assoc), Ghdl_Signal_Out_Conversion, Assoc_Info.Assoc_Out, Ndest); end Elab_Out_Conversion; |