summaryrefslogtreecommitdiff
path: root/assignment-13/uFPL/Sim.dcl
blob: b4d8528d717c436a56e6f9500e23c0c1fe62a6c1 (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
definition module uFPL.Sim

from Data.Map import :: Map

import uFPL
from uFPL.C import :: Signedness

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

instance toString UFPLException

:: 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]

:: IShareState t =
	{ isval           :: t
	, isdirty         :: Int
	, issubscriptions :: Int
	}

:: IState =
	{ isvalues :: Map String (IShareState Int)
	, csvalues :: Map String (IShareState Char)
	, bsvalues :: Map String (IShareState Bool)
	, display  :: Display
	}

simulate :: [NamedRule] -> *World -> *World