aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2015-06-18 22:37:52 +0200
committerTristan Gingold <tgingold@free.fr>2015-06-18 22:37:52 +0200
commit03f2df0a31ac07711863c9580bc3bc48cbab3a3b (patch)
tree75ebb46eebccd07113efd31bb29ae96e5b9fb119
parent8a3f67db595be25637b4edc65f18138b48ccdac6 (diff)
downloadghdl-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.adb27
-rw-r--r--src/ortho/gcc/ortho-lang.c2
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;