summaryrefslogtreecommitdiff
path: root/assignment-13/uFPL/Sim.dcl
blob: 36e4e73ae1904fe1ba591eb8987795a7fbbed30c (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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

:: ISharedInt =
	{ iisname :: String
	, iisinit :: Int
	, iisrw   :: ReadOrWrite
	}

:: ISharedUInt =
	{ iuisname :: String
	, iuisinit :: Int
	, iuisrw   :: ReadOrWrite
	}

:: ISharedLong =
	{ ilsname :: String
	, ilsinit :: Int
	, ilsrw   :: ReadOrWrite
	}

:: ISharedULong =
	{ iulsname :: String
	, iulsinit :: Int
	, iulsrw   :: ReadOrWrite
	}

:: ISharedBool =
	{ ibsname :: String
	, ibsinit :: Bool
	, ibsrw   :: ReadOrWrite
	}

:: ISharedRef :== String

:: IShares =
	{  ishares :: [ISharedInt]
	, uishares :: [ISharedUInt]
	,  lshares :: [ISharedLong]
	, ulshares :: [ISharedULong]
	,  bshares :: [ISharedBool]
	}

:: 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, ISharedInt, ISharedUInt,
	ISharedLong, ISharedULong, ISharedBool, IShares, 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 ISharedInt
instance unlift ISharedInt (UShared Int rw)
instance lift ITrigger
instance unlift ITrigger Trigger
instance lift IRule
instance unlift IRule Rule
instance lift INamedRule
instance unlift INamedRule NamedRule

simulate :: [NamedRule] -> Task ()