diff options
-rw-r--r-- | src/synth/synth-context.adb | 12 | ||||
-rw-r--r-- | src/synth/synth-context.ads | 9 | ||||
-rw-r--r-- | src/synth/synth-oper.adb | 6 | ||||
-rw-r--r-- | src/synth/synth-stmts.adb | 80 |
4 files changed, 81 insertions, 26 deletions
diff --git a/src/synth/synth-context.adb b/src/synth/synth-context.adb index e5e5479a8..b192994ab 100644 --- a/src/synth/synth-context.adb +++ b/src/synth/synth-context.adb @@ -61,6 +61,7 @@ package body Synth.Context is Res := new Synth_Instance_Type'(Max_Objs => Global_Info.Nbr_Objects, Is_Const => False, + Is_Error => False, Base => Base, Name => No_Sname, Block_Scope => Global_Info, @@ -96,6 +97,7 @@ package body Synth.Context is Res := new Synth_Instance_Type'(Max_Objs => Info.Nbr_Objects, Is_Const => False, + Is_Error => False, Base => Parent.Base, Name => Name, Block_Scope => Scope, @@ -135,6 +137,16 @@ package body Synth.Context is Inst.Base := Base; end Set_Instance_Module; + function Is_Error (Inst : Synth_Instance_Acc) return Boolean is + begin + return Inst.Is_Error; + end Is_Error; + + procedure Set_Error (Inst : Synth_Instance_Acc) is + begin + Inst.Is_Error := True; + end Set_Error; + function Get_Instance_Module (Inst : Synth_Instance_Acc) return Module is begin return Inst.Base.Cur_Module; diff --git a/src/synth/synth-context.ads b/src/synth/synth-context.ads index e01011256..b5c1619f1 100644 --- a/src/synth/synth-context.ads +++ b/src/synth/synth-context.ads @@ -52,6 +52,11 @@ package Synth.Context is return Synth_Instance_Acc; procedure Free_Instance (Synth_Inst : in out Synth_Instance_Acc); + function Is_Error (Inst : Synth_Instance_Acc) return Boolean; + pragma Inline (Is_Error); + + procedure Set_Error (Inst : Synth_Instance_Acc); + function Get_Sname (Inst : Synth_Instance_Acc) return Sname; pragma Inline (Get_Sname); @@ -133,6 +138,10 @@ private type Synth_Instance_Type (Max_Objs : Object_Slot_Type) is limited record Is_Const : Boolean; + -- True if a fatal error has been detected that aborts the synthesis + -- of this instance. + Is_Error : Boolean; + Base : Base_Instance_Acc; -- Name prefix for declarations. diff --git a/src/synth/synth-oper.adb b/src/synth/synth-oper.adb index 2399c33f1..4e8c434c4 100644 --- a/src/synth/synth-oper.adb +++ b/src/synth/synth-oper.adb @@ -573,9 +573,15 @@ package body Synth.Oper is end Synth_Rotation; begin Left := Synth_Expression_With_Type (Syn_Inst, Left_Expr, Left_Typ); + if Left = null then + return null; + end if; Left := Synth_Subtype_Conversion (Left, Left_Typ, False, Expr); Strip_Const (Left); Right := Synth_Expression_With_Type (Syn_Inst, Right_Expr, Right_Typ); + if Right = null then + return null; + end if; Right := Synth_Subtype_Conversion (Right, Right_Typ, False, Expr); Strip_Const (Right); diff --git a/src/synth/synth-stmts.adb b/src/synth/synth-stmts.adb index 7b2213301..59f14a990 100644 --- a/src/synth/synth-stmts.adb +++ b/src/synth/synth-stmts.adb @@ -94,6 +94,9 @@ package body Synth.Stmts is Offset : Uns32; Loc : Source.Syn_Src) is begin + if Val = null then + return; + end if; Phi_Assign (Build_Context, Wid, Get_Net (Synth_Subtype_Conversion (Val, Typ, False, Loc)), Offset); @@ -572,6 +575,7 @@ package body Synth.Stmts is Cwf : Node; Inp : Input; Val, Cond_Val : Value_Acc; + Cond_Net : Net; First, Last : Net; V : Net; begin @@ -586,9 +590,13 @@ package body Synth.Stmts is Cond := Get_Condition (Cwf); if Cond /= Null_Node then Cond_Val := Synth_Expression (Syn_Inst, Cond); - V := Build_Mux2 (Build_Context, - Get_Net (Cond_Val), - No_Net, V); + if Cond_Val = null then + Cond_Net := Build_Const_UB32 (Build_Context, 0, 1); + else + Cond_Net := Get_Net (Cond_Val); + end if; + + V := Build_Mux2 (Build_Context, Cond_Net, No_Net, V); Set_Location (V, Cwf); end if; @@ -1541,6 +1549,11 @@ package body Synth.Stmts is end case; end case; + if Val = null then + Set_Error (Subprg_Inst); + return; + end if; + -- FIXME: conversion only for constants, reshape for all. Val := Synth_Subtype_Conversion (Val, Inter_Type, True, Assoc); @@ -1716,21 +1729,26 @@ package body Synth.Stmts is Phi_Assign (Build_Context, C.W_Ret, Get_Inst_Bit1 (Syn_Inst), 0); Decls.Synth_Declarations (C.Inst, Get_Declaration_Chain (Bod), True); + if not Is_Error (C.Inst) then + Synth_Sequential_Statements (C, Get_Sequential_Statement_Chain (Bod)); + end if; - Synth_Sequential_Statements (C, Get_Sequential_Statement_Chain (Bod)); - - if Is_Func then - if C.Nbr_Ret = 0 then - raise Internal_Error; - elsif C.Nbr_Ret = 1 and then Is_Static (C.Ret_Value) then - Res := C.Ret_Value; + if Is_Error (C.Inst) then + Res := null; + else + if Is_Func then + if C.Nbr_Ret = 0 then + raise Internal_Error; + elsif C.Nbr_Ret = 1 and then Is_Static (C.Ret_Value) then + Res := C.Ret_Value; + else + Res := Create_Value_Net + (Get_Current_Value (Build_Context, C.W_Val), C.Ret_Value.Typ); + end if; else - Res := Create_Value_Net - (Get_Current_Value (Build_Context, C.W_Val), C.Ret_Value.Typ); + Res := null; + Synth_Subprogram_Back_Association (C.Inst, Syn_Inst, Init, Infos); end if; - else - Res := null; - Synth_Subprogram_Back_Association (C.Inst, Syn_Inst, Init, Infos); end if; Pop_Phi (Subprg_Phi); @@ -1821,18 +1839,22 @@ package body Synth.Stmts is New_Internal_Name (Build_Context)); Synth_Subprogram_Association (Sub_Inst, Syn_Inst, Init, Infos); - if not Is_Func then - if Get_Purity_State (Imp) /= Pure then - Set_Instance_Const (Sub_Inst, False); + if Is_Error (Sub_Inst) then + Res := null; + else + if not Is_Func then + if Get_Purity_State (Imp) /= Pure then + Set_Instance_Const (Sub_Inst, False); + end if; end if; - end if; - if Get_Instance_Const (Sub_Inst) then - Res := Synth_Static_Subprogram_Call - (Syn_Inst, Sub_Inst, Call, Init, Infos); - else - Res := Synth_Dynamic_Subprogram_Call - (Syn_Inst, Sub_Inst, Call, Init, Infos); + if Get_Instance_Const (Sub_Inst) then + Res := Synth_Static_Subprogram_Call + (Syn_Inst, Sub_Inst, Call, Init, Infos); + else + Res := Synth_Dynamic_Subprogram_Call + (Syn_Inst, Sub_Inst, Call, Init, Infos); + end if; end if; Free_Instance (Sub_Inst); @@ -2350,6 +2372,11 @@ package body Synth.Stmts is if Expr /= Null_Node then -- Return in function. Val := Synth_Expression_With_Type (C.Inst, Expr, C.Ret_Typ); + if Val = null then + Set_Error (C.Inst); + return; + end if; + Val := Synth_Subtype_Conversion (Val, C.Ret_Typ, True, Stmt); if C.Nbr_Ret = 0 then @@ -2599,7 +2626,8 @@ package body Synth.Stmts is if Get_Identifier (Lib) = Std_Names.Name_Ieee then Error_Msg_Synth (+Expr, "unhandled call to an ieee function"); - raise Internal_Error; + Set_Error (Syn_Inst); + return null; end if; end if; end if; |