summaryrefslogtreecommitdiff
path: root/assignment-13/uFPL/Sim.dcl
blob: f30e10701ef7c8612a92d64f444a13ba923dffdd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
definition module uFPL.Sim

from Data.Map import :: Map

import iTasks

import uFPL
from uFPL.C import :: Signedness

:: UFPLException
	= LiftException String
	| NoShareException ISharedRef
	| WriteToROShare ISharedRef

instance toString UFPLException

class lift a :: a -> Task Dynamic
class unlift a b :: b -> a

:: ReadOrWrite = ReadOnly | ReadWrite

:: IShared
	= ISharedInt   String Int  ReadOrWrite
	| ISharedUInt  String Int  ReadOrWrite
	| ISharedLong  String Int  ReadOrWrite
	| ISharedULong String Int  ReadOrWrite
	| ISharedBool  String Bool ReadOrWrite

:: ISharedRef :== String

:: IShares :== [IShared]

:: IExpr
	= ILitInt  Int
	| ILitBool Bool
	| ILitChar Char
	| IShared ISharedRef
	| IAdd IExpr IExpr
	| ISub IExpr IExpr
	| IMul IExpr IExpr
	| IDiv IExpr IExpr
	| IEq  IExpr IExpr
	| ILt  IExpr IExpr
	| IAnd IExpr IExpr
	| IOr  IExpr IExpr
	| IIf  IExpr IExpr IExpr

:: ITrigger
	= IChange ISharedRef
	| IBecomes ISharedRef IExpr
	| ITAnd ITrigger ITrigger
	| ITOr ITrigger ITrigger

:: IRule
	= IAssign ISharedRef IExpr
	| IWhen IExpr [IRule]
	| ITrigger ITrigger [IRule]
	| ISetCursor (IExpr, IExpr)
	| IPrint IExpr

:: INamedRule = Rule String [IRule]

:: IState =
	{  isvalues :: Map String Int
	, uisvalues :: Map String Int
	,  lsvalues :: Map String Int
	, ulsvalues :: Map String Int
	,  bsvalues :: Map String Bool
	}

derive class iTask Signedness, CType, ReadOrWrite, IShared, IExpr, ITrigger,
	IRule, INamedRule, IState

instance lift [a] | lift a
instance unlift [a] [b] | unlift a b
instance lift IExpr
instance unlift IExpr (Expr t rw) | Expr t
instance lift ITrigger
instance unlift ITrigger Trigger
instance lift IRule
instance unlift IRule Rule
instance lift INamedRule
instance unlift INamedRule NamedRule

simulate :: [NamedRule] -> Task ()