diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/synth/synth-decls.adb | 2 | ||||
-rw-r--r-- | src/synth/synth-values.adb | 44 |
2 files changed, 42 insertions, 4 deletions
diff --git a/src/synth/synth-decls.adb b/src/synth/synth-decls.adb index a0a904795..f3ceb64a1 100644 --- a/src/synth/synth-decls.adb +++ b/src/synth/synth-decls.adb @@ -572,7 +572,7 @@ package body Synth.Decls is end if; if Get_Instance_Const (Syn_Inst) then pragma Assert (Init /= null); - Create_Object (Syn_Inst, Decl, Init); + Create_Object (Syn_Inst, Decl, Unshare (Init, Current_Pool)); else Create_Wire_Object (Syn_Inst, Wire_Variable, Decl); Create_Var_Wire (Syn_Inst, Decl, Init); diff --git a/src/synth/synth-values.adb b/src/synth/synth-values.adb index 454179617..8a9cbaa5b 100644 --- a/src/synth/synth-values.adb +++ b/src/synth/synth-values.adb @@ -595,14 +595,52 @@ package body Synth.Values is end if; end Strip_Const; - function Copy (Src: in Value_Acc) return Value_Acc + function Copy (Src : Value_Acc) return Value_Acc; + + function Copy_Array (Arr : Value_Array_Acc) return Value_Array_Acc + is + Res : Value_Array_Acc; + begin + Res := Create_Value_Array (Arr.Len); + for I in Res.V'Range loop + Res.V (I) := Copy (Arr.V (I)); + end loop; + return Res; + end Copy_Array; + + function Copy (Src : Value_Acc) return Value_Acc is - Res: Value_Acc; + Res : Value_Acc; + Arr : Value_Array_Acc; begin case Src.Kind is + when Value_Net => + Res := Create_Value_Net (Src.N, Src.Typ); when Value_Wire => Res := Create_Value_Wire (Src.W, Src.Typ); - when others => + when Value_Discrete => + Res := Create_Value_Discrete (Src.Scal, Src.Typ); + when Value_Float => + Res := Create_Value_Float (Src.Fp, Src.Typ); + when Value_Subtype => + Res := Create_Value_Subtype (Src.Typ); + when Value_Array => + Arr := Copy_Array (Src.Arr); + Res := Create_Value_Array (Src.Typ, Arr); + when Value_Const_Array => + Arr := Copy_Array (Src.Arr); + Res := Create_Value_Const_Array (Src.Typ, Arr); + when Value_Record => + Arr := Copy_Array (Src.Rec); + Res := Create_Value_Record (Src.Typ, Arr); + when Value_Const_Record => + Arr := Copy_Array (Src.Rec); + Res := Create_Value_Const_Record (Src.Typ, Arr); + when Value_Instance => + raise Internal_Error; + when Value_Const => + raise Internal_Error; + when Value_Alias => raise Internal_Error; end case; return Res; |