diff options
author | Tristan Gingold <tgingold@free.fr> | 2020-01-12 21:06:16 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2020-01-12 21:06:16 +0100 |
commit | 0baaab9bb57234496f1ebaf90e28f4b8cc32d29a (patch) | |
tree | 43f2c06ab99c9fb6ff095bac9b4543faa667eceb /src | |
parent | 9f75c27b3a721f7cd947a47e24d289bf971cc3dd (diff) | |
download | ghdl-0baaab9bb57234496f1ebaf90e28f4b8cc32d29a.tar.gz ghdl-0baaab9bb57234496f1ebaf90e28f4b8cc32d29a.tar.bz2 ghdl-0baaab9bb57234496f1ebaf90e28f4b8cc32d29a.zip |
netlists-utils: factorize code (same_net).
Diffstat (limited to 'src')
-rw-r--r-- | src/synth/netlists-utils.adb | 39 | ||||
-rw-r--r-- | src/synth/synth-expr.adb | 37 |
2 files changed, 25 insertions, 51 deletions
diff --git a/src/synth/netlists-utils.adb b/src/synth/netlists-utils.adb index 3f9a9fd46..5e6a5c269 100644 --- a/src/synth/netlists-utils.adb +++ b/src/synth/netlists-utils.adb @@ -242,10 +242,7 @@ package body Netlists.Utils is Free_Instance (Inst); end Disconnect_And_Free; - function Same_Net (L, R : Net) return Boolean - is - Linst : Instance; - Rinst : Instance; + function Same_Net (L, R : Net) return Boolean is begin if L = R then -- Obvious case. @@ -257,17 +254,29 @@ package body Netlists.Utils is return False; end if; - -- Handle extract. - Linst := Get_Net_Parent (L); - if Get_Id (Linst) /= Id_Extract then - return False; - end if; - Rinst := Get_Net_Parent (R); - if Get_Id (Rinst) /= Id_Extract then - return False; - end if; - return Get_Input_Net (Linst, 0) = Get_Input_Net (Rinst, 0) - and then Get_Param_Uns32 (Linst, 0) = Get_Param_Uns32 (Rinst, 0); + declare + Linst : constant Instance := Get_Net_Parent (L); + Rinst : constant Instance := Get_Net_Parent (R); + begin + if Get_Id (Linst) /= Get_Id (Rinst) then + return False; + end if; + case Get_Id (Linst) is + when Id_Uextend => + -- When index is extended from a subtype. + return Same_Net (Get_Input_Net (Linst, 0), + Get_Input_Net (Rinst, 0)); + when Id_Extract => + -- When index is extracted from a record. + if Get_Param_Uns32 (Linst, 0) /= Get_Param_Uns32 (Rinst, 0) then + return False; + end if; + return Same_Net (Get_Input_Net (Linst, 0), + Get_Input_Net (Rinst, 0)); + when others => + return False; + end case; + end; end Same_Net; function Clog2 (W : Width) return Width is diff --git a/src/synth/synth-expr.adb b/src/synth/synth-expr.adb index 9a5aa23e4..cffd17c34 100644 --- a/src/synth/synth-expr.adb +++ b/src/synth/synth-expr.adb @@ -1242,41 +1242,6 @@ package body Synth.Expr is end loop; end Decompose_Mul_Add; - function Is_Same (L, R : Net) return Boolean is - begin - if L = R then - return True; - end if; - - if Get_Width (L) /= Get_Width (R) then - return False; - end if; - - declare - Linst : constant Instance := Get_Net_Parent (L); - Rinst : constant Instance := Get_Net_Parent (R); - begin - if Get_Id (Linst) /= Get_Id (Rinst) then - return False; - end if; - case Get_Id (Linst) is - when Id_Uextend => - -- When index is extended from a subtype. - return Is_Same (Get_Input_Net (Linst, 0), - Get_Input_Net (Rinst, 0)); - when Id_Extract => - -- When index is extracted from a record. - if Get_Param_Uns32 (Linst, 0) /= Get_Param_Uns32 (Rinst, 0) then - return False; - end if; - return Is_Same (Get_Input_Net (Linst, 0), - Get_Input_Net (Rinst, 0)); - when others => - return False; - end case; - end; - end Is_Same; - -- Identify LEFT to/downto RIGHT as: -- INP * STEP + WIDTH - 1 + OFF to/downto INP * STEP + OFF procedure Synth_Extract_Dyn_Suffix (Loc : Node; @@ -1309,7 +1274,7 @@ package body Synth.Expr is Decompose_Mul_Add (Right, R_Inp, R_Fac, R_Add); end if; - if not Is_Same (L_Inp, R_Inp) then + if not Same_Net (L_Inp, R_Inp) then Error_Msg_Synth (+Loc, "cannot extract same variable part for dynamic slice"); return; |