Fix ALT enabling in the C backend.

This commit is contained in:
Adam Sampson 2008-03-10 11:38:25 +00:00
parent 0b93e67ca3
commit 8aae275895

View File

@ -1566,17 +1566,21 @@ cgenPar pm s
--{{{ alt
cgenAlt :: Bool -> A.Structured A.Alternative -> CGen ()
cgenAlt isPri s
= do tell ["Alt (wptr);\n"]
= do id <- csmLift $ makeNonce "alt_id"
tell ["int ", id, " = 0;\n"]
tell ["Alt (wptr);\n"]
tell ["{\n"]
genAltEnable s
genAltEnable id s
tell ["}\n"]
-- Like occ21, this is always a PRI ALT, so we can use it for both.
tell ["AltWait (wptr);\n"]
id <- csmLift $ makeNonce "alt_id"
tell ["int ", id, " = 0;\n"]
tell [id, " = 0;\n"]
tell ["{\n"]
genAltDisable id s
tell ["}\n"]
fired <- csmLift $ makeNonce "alt_fired"
tell ["int ", fired, " = AltEnd (wptr);\n"]
tell [id, " = 0;\n"]
@ -1586,17 +1590,17 @@ cgenAlt isPri s
tell ["}\n"]
tell [label, ":\n;\n"]
where
genAltEnable :: A.Structured A.Alternative -> CGen ()
genAltEnable s = call genStructured s doA
genAltEnable :: String -> A.Structured A.Alternative -> CGen ()
genAltEnable id s = call genStructured s doA
where
doA _ alt
= case alt of
A.Alternative _ c im _ -> doIn c im
A.AlternativeCond _ e c im _ -> withIf e $ doIn c im
A.AlternativeSkip _ e _ -> withIf e $ tell ["AltEnableSkip (wptr);\n"]
A.AlternativeSkip _ e _ -> withIf e $ tell ["AltEnableSkip (wptr,", id, "++);\n"]
--transformWaitFor should have removed all A.WaitFor guards (transforming them into A.WaitUntil):
A.AlternativeWait _ A.WaitUntil e _ ->
do tell ["AltEnableTimer (wptr,"]
do tell ["AltEnableTimer (wptr,", id, "++,"]
call genExpression e
tell [" );\n"]
@ -1604,11 +1608,11 @@ cgenAlt isPri s
= do case im of
A.InputTimerRead _ _ -> call genMissing "timer read in ALT"
A.InputTimerAfter _ time ->
do tell ["AltEnableTimer (wptr,"]
do tell ["AltEnableTimer (wptr,", id, "++,"]
call genExpression time
tell [");\n"]
_ ->
do tell ["AltEnableChannel (wptr,"]
do tell ["AltEnableChannel (wptr,", id, "++,"]
call genVariable c
tell [");\n"]