diff options
author | Tristan Gingold <tgingold@free.fr> | 2015-06-18 22:37:52 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2015-06-18 22:37:52 +0200 |
commit | 03f2df0a31ac07711863c9580bc3bc48cbab3a3b (patch) | |
tree | 75ebb46eebccd07113efd31bb29ae96e5b9fb119 | |
parent | 8a3f67db595be25637b4edc65f18138b48ccdac6 (diff) | |
download | ghdl-03f2df0a31ac07711863c9580bc3bc48cbab3a3b.tar.gz ghdl-03f2df0a31ac07711863c9580bc3bc48cbab3a3b.tar.bz2 ghdl-03f2df0a31ac07711863c9580bc3bc48cbab3a3b.zip |
signals: simplify and fix code for delayed signals.
fix ticket89.
-rw-r--r-- | src/grt/grt-signals.adb | 27 | ||||
-rw-r--r-- | src/ortho/gcc/ortho-lang.c | 2 |
2 files changed, 10 insertions, 19 deletions
diff --git a/src/grt/grt-signals.adb b/src/grt/grt-signals.adb index 38d33c866..96e2b9838 100644 --- a/src/grt/grt-signals.adb +++ b/src/grt/grt-signals.adb @@ -2773,23 +2773,25 @@ package body Grt.Signals is procedure Delayed_Implicit_Process (Sig : Ghdl_Signal_Ptr) is - Pfx : Ghdl_Signal_Ptr; + Pfx : constant Ghdl_Signal_Ptr := Sig.Ports (0); Trans : Transaction_Acc; Last : Transaction_Acc; Prev : Transaction_Acc; begin - Pfx := Sig.Ports (0); if Pfx.Event then -- LRM 14.1 -- P: process (S) -- begin -- R <= transport S after T; -- end process; + + -- Create the transaction. Trans := new Transaction'(Kind => Trans_Value, Line => 0, Time => Current_Time + Sig.S.Time, Next => null, Val => Pfx.Value); + -- Find the last transaction. Last := Sig.S.Attr_Trans; Prev := Last; @@ -2797,22 +2799,11 @@ package body Grt.Signals is Prev := Last; Last := Last.Next; end loop; - -- Maybe, remove it. - if Last.Time > Trans.Time then - Internal_Error ("delayed time"); - elsif Last.Time = Trans.Time then - if Prev /= Last then - Free (Last); - else - -- No transaction. - if Last.Time /= 0 then - -- This can happen only at time = 0. - Internal_Error ("delayed"); - end if; - end if; - else - Prev := Last; - end if; + + -- The transaction are scheduled after the last one. + pragma Assert (Last.Time <= Trans.Time); + pragma Assert (Last.Time /= Trans.Time or else Prev = Last); + -- Append the transaction. Prev.Next := Trans; if Sig.S.Time = 0 then diff --git a/src/ortho/gcc/ortho-lang.c b/src/ortho/gcc/ortho-lang.c index 020c9e5ea..0c38fbfce 100644 --- a/src/ortho/gcc/ortho-lang.c +++ b/src/ortho/gcc/ortho-lang.c @@ -1409,7 +1409,7 @@ new_selected_element (tree rec, tree el) { tree res; - gcc_assert (TREE_CODE (TREE_TYPE (rec)) == RECORD_TYPE); + gcc_assert (RECORD_OR_UNION_TYPE_P (TREE_TYPE (rec))); res = build3 (COMPONENT_REF, TREE_TYPE (el), rec, el, NULL_TREE); return res; |