Skip to content

Commit d0c1a12

Browse files
authored
Merge pull request #81 from grin-compiler/32-ES-to-master
Early merge of new syntax to master
2 parents 086387d + 0974c35 commit d0c1a12

File tree

93 files changed

+15221
-11
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+15221
-11
lines changed

grin/grin.cabal

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,36 @@ library
1717
hs-source-dirs: src
1818
default-extensions: OverloadedStrings
1919
exposed-modules:
20+
AbstractInterpretation.ExtendedSyntax.IR
21+
AbstractInterpretation.ExtendedSyntax.PrettyIR
22+
AbstractInterpretation.ExtendedSyntax.BinaryIR
23+
AbstractInterpretation.ExtendedSyntax.BinaryResult
24+
AbstractInterpretation.ExtendedSyntax.ReduceCpp
25+
AbstractInterpretation.ExtendedSyntax.Reduce
26+
AbstractInterpretation.ExtendedSyntax.Util
27+
AbstractInterpretation.ExtendedSyntax.OptimiseAbstractProgram
28+
AbstractInterpretation.ExtendedSyntax.CreatedBy.Result
29+
AbstractInterpretation.ExtendedSyntax.CreatedBy.Readback
30+
AbstractInterpretation.ExtendedSyntax.CreatedBy.Util
31+
AbstractInterpretation.ExtendedSyntax.CreatedBy.CodeGen
32+
AbstractInterpretation.ExtendedSyntax.CreatedBy.CodeGenBase
33+
AbstractInterpretation.ExtendedSyntax.CreatedBy.Pretty
34+
AbstractInterpretation.ExtendedSyntax.EffectTracking.CodeGenBase
35+
AbstractInterpretation.ExtendedSyntax.EffectTracking.CodeGen
36+
AbstractInterpretation.ExtendedSyntax.EffectTracking.Pretty
37+
AbstractInterpretation.ExtendedSyntax.EffectTracking.Result
38+
AbstractInterpretation.ExtendedSyntax.HeapPointsTo.CodeGenBase
39+
AbstractInterpretation.ExtendedSyntax.HeapPointsTo.CodeGen
40+
AbstractInterpretation.ExtendedSyntax.HeapPointsTo.Pretty
41+
AbstractInterpretation.ExtendedSyntax.HeapPointsTo.Result
42+
AbstractInterpretation.ExtendedSyntax.LiveVariable.CodeGen
43+
AbstractInterpretation.ExtendedSyntax.LiveVariable.CodeGenBase
44+
AbstractInterpretation.ExtendedSyntax.LiveVariable.Result
45+
AbstractInterpretation.ExtendedSyntax.LiveVariable.Pretty
46+
AbstractInterpretation.ExtendedSyntax.Sharing.CodeGen
47+
AbstractInterpretation.ExtendedSyntax.Sharing.Pretty
48+
AbstractInterpretation.ExtendedSyntax.Sharing.Result
49+
2050
AbstractInterpretation.CreatedBy.Result
2151
AbstractInterpretation.CreatedBy.Readback
2252
AbstractInterpretation.CreatedBy.Util
@@ -66,6 +96,25 @@ library
6696
Grin.PrimOpsPrelude
6797
Grin.Nametable
6898
Grin.Research
99+
Grin.ExtendedSyntax.Syntax
100+
Grin.ExtendedSyntax.SyntaxDefs
101+
Grin.ExtendedSyntax.Grin
102+
Grin.ExtendedSyntax.EffectMap
103+
Grin.ExtendedSyntax.Lint
104+
Grin.ExtendedSyntax.Nametable
105+
Grin.ExtendedSyntax.Parse
106+
Grin.ExtendedSyntax.Parse.AST
107+
Grin.ExtendedSyntax.Parse.Basic
108+
Grin.ExtendedSyntax.Parse.TypeEnv
109+
Grin.ExtendedSyntax.Pretty
110+
Grin.ExtendedSyntax.PrettyLint
111+
Grin.ExtendedSyntax.PrimOpsPrelude
112+
Grin.ExtendedSyntax.Statistics
113+
Grin.ExtendedSyntax.TH
114+
Grin.ExtendedSyntax.TypeCheck
115+
Grin.ExtendedSyntax.TypeEnv
116+
Grin.ExtendedSyntax.TypeEnvDefs
117+
Grin.ExtendedSyntax.GADT
69118
Pipeline.Eval
70119
Pipeline.Optimizations
71120
Pipeline.Pipeline
@@ -85,6 +134,23 @@ library
85134
Test.IO
86135
Test.Test
87136
Test.Util
137+
Test.ExtendedSyntax.Assertions
138+
Test.ExtendedSyntax.Old.Grammar
139+
Test.ExtendedSyntax.Old.Test
140+
Test.ExtendedSyntax.New.Test
141+
Test.ExtendedSyntax.Util
142+
143+
Transformations.ExtendedSyntax.BindNormalisation
144+
Transformations.ExtendedSyntax.CountVariableUse
145+
Transformations.ExtendedSyntax.EffectMap
146+
Transformations.ExtendedSyntax.GenerateEval
147+
Transformations.ExtendedSyntax.MangleNames
148+
Transformations.ExtendedSyntax.StaticSingleAssignment
149+
Transformations.ExtendedSyntax.Optimising.CopyPropagation
150+
Transformations.ExtendedSyntax.Optimising.CSE
151+
Transformations.ExtendedSyntax.Optimising.EvaluatedCaseElimination
152+
Transformations.ExtendedSyntax.Optimising.TrivialCaseElimination
153+
88154
Transformations.BindNormalisation
89155
Transformations.CountVariableUse
90156
Transformations.EffectMap
@@ -94,6 +160,9 @@ library
94160
Transformations.StaticSingleAssignment
95161
Transformations.UnitPropagation
96162
Transformations.Util
163+
Transformations.ExtendedSyntax.Conversion
164+
Transformations.ExtendedSyntax.Names
165+
Transformations.ExtendedSyntax.Util
97166
Transformations.Optimising.ArityRaising
98167
Transformations.Optimising.CaseCopyPropagation
99168
Transformations.Optimising.CaseHoisting
@@ -323,6 +392,18 @@ test-suite grin-end-to-end-test
323392
, bytestring
324393
, MissingH
325394
other-modules:
395+
ExtendedSyntax.LintSpec
396+
ExtendedSyntax.NametableSpec
397+
ExtendedSyntax.ParserSpec
398+
Transformations.ExtendedSyntax.BindNormalisationSpec
399+
Transformations.ExtendedSyntax.ConversionSpec
400+
Transformations.ExtendedSyntax.MangleNamesSpec
401+
Transformations.ExtendedSyntax.StaticSingleAssignmentSpec
402+
Transformations.ExtendedSyntax.Optimising.CopyPropagationSpec
403+
Transformations.ExtendedSyntax.Optimising.CSESpec
404+
Transformations.ExtendedSyntax.Optimising.EvaluatedCaseEliminationSpec
405+
Transformations.ExtendedSyntax.Optimising.TrivialCaseEliminationSpec
406+
326407
Transformations.Simplifying.RegisterIntroductionSpec
327408
Transformations.Simplifying.CaseSimplificationSpec
328409
Transformations.Simplifying.SplitFetchSpec
@@ -363,6 +444,13 @@ test-suite grin-end-to-end-test
363444
ParserSpec
364445
PrimOpsSpec
365446
NametableSpec
447+
AbstractInterpretation.ExtendedSyntax.EffectTrackingSpec
448+
AbstractInterpretation.ExtendedSyntax.CreatedBySpec
449+
AbstractInterpretation.ExtendedSyntax.HptSpec
450+
AbstractInterpretation.ExtendedSyntax.IRSpec
451+
AbstractInterpretation.ExtendedSyntax.LiveVariableSpec
452+
AbstractInterpretation.ExtendedSyntax.OptimiseAbstractProgramSpec
453+
AbstractInterpretation.ExtendedSyntax.SharingSpec
366454
AbstractInterpretation.HptSpec
367455
AbstractInterpretation.LiveVariableSpec
368456
AbstractInterpretation.EffectTrackingSpec
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
{-# LANGUAGE LambdaCase, RecordWildCards, Strict #-}
2+
module AbstractInterpretation.ExtendedSyntax.BinaryIR (encodeAbstractProgram) where
3+
4+
import Control.Monad.State
5+
import Data.Set (Set)
6+
import qualified Data.Set as Set
7+
import Data.Map (Map)
8+
import qualified Data.Map as Map
9+
import qualified Data.ByteString.Lazy as LBS
10+
import Data.ByteString.Builder
11+
12+
import AbstractInterpretation.ExtendedSyntax.IR
13+
14+
data Env
15+
= Env
16+
{ envTagMap :: Map (Set Tag) Int32
17+
, envBlockCount :: !Int
18+
, envBuilder :: !Builder
19+
, envBuilderMap :: Map Int (Int, Builder) -- block size, data
20+
, envInstCount :: !Int
21+
}
22+
23+
emptyEnv = Env
24+
{ envTagMap = mempty
25+
, envBlockCount = 0
26+
, envBuilder = mempty
27+
, envBuilderMap = mempty
28+
, envInstCount = 0
29+
}
30+
31+
type W = State Env
32+
33+
emit :: Builder -> W ()
34+
emit b = modify' $ \env@Env{..} -> env {envBuilder = envBuilder <> b}
35+
36+
writeI32 :: Int32 -> W ()
37+
writeI32 i = emit $ int32LE i
38+
39+
writeW32 :: Word32 -> W ()
40+
writeW32 w = emit $ word32LE w
41+
42+
writeReg :: Reg -> W ()
43+
writeReg (Reg r) = writeW32 r
44+
45+
writeMem :: Mem -> W ()
46+
writeMem (Mem m) = writeW32 m
47+
48+
writeTagSet :: Set Tag -> W ()
49+
writeTagSet s = do
50+
tm <- gets envTagMap
51+
let size = fromIntegral $ Map.size tm
52+
case Map.lookup s tm of
53+
Just idx -> writeI32 idx
54+
Nothing -> do
55+
modify' $ \env@Env{..} -> env {envTagMap = Map.insert s size envTagMap}
56+
writeI32 size
57+
58+
writeBlock :: [Instruction] -> W ()
59+
writeBlock il = do
60+
let size = length il
61+
blockIndex <- gets envBlockCount
62+
modify' $ \env@Env{..} -> env {envInstCount = envInstCount + size, envBlockCount = succ blockIndex}
63+
writeI32 $ fromIntegral blockIndex
64+
savedBuilder <- gets envBuilder
65+
modify' $ \env@Env{..} -> env {envBuilder = mempty}
66+
mapM_ writeInstruction il
67+
blockBuilder <- gets envBuilder
68+
modify' $ \env@Env{..} -> env {envBuilder = savedBuilder, envBuilderMap = Map.insert blockIndex (size, blockBuilder) envBuilderMap}
69+
70+
-----------------------------------
71+
72+
writeRange :: Range -> W ()
73+
writeRange Range{..} = do
74+
writeI32 from
75+
writeI32 to
76+
77+
writeType :: Int32 -> W ()
78+
writeType = writeI32
79+
80+
writeTag :: Tag -> W ()
81+
writeTag (Tag w) = writeW32 w
82+
83+
writePredicate :: Predicate -> W ()
84+
writePredicate = \case
85+
TagIn s -> do
86+
writeType 100
87+
writeTagSet s
88+
TagNotIn s -> do
89+
writeType 101
90+
writeTagSet s
91+
ValueIn r -> do
92+
writeType 102
93+
writeRange r
94+
ValueNotIn r -> do
95+
writeType 103
96+
writeRange r
97+
98+
writeCondition :: Condition -> W ()
99+
writeCondition = \case
100+
NodeTypeExists t -> do
101+
writeType 200
102+
writeTag t
103+
SimpleTypeExists st -> do
104+
writeType 201
105+
writeI32 st
106+
AnyNotIn s -> do
107+
writeType 202
108+
writeTagSet s
109+
Any p -> do
110+
writeType 203
111+
writePredicate p
112+
113+
writeSelector :: Selector -> W ()
114+
writeSelector = \case
115+
NodeItem t i -> do
116+
writeType 300
117+
writeTag t
118+
writeI32 $ fromIntegral i
119+
ConditionAsSelector c -> do
120+
writeType 301
121+
writeCondition c
122+
AllFields -> do
123+
writeType 302
124+
125+
writeConstant :: Constant -> W ()
126+
writeConstant = \case
127+
CSimpleType st -> do
128+
writeType 400
129+
writeI32 st
130+
CHeapLocation m -> do
131+
writeType 401
132+
writeMem m
133+
CNodeType t a -> do
134+
writeType 402
135+
writeTag t
136+
writeI32 $ fromIntegral a
137+
CNodeItem t i v -> do
138+
writeType 403
139+
writeTag t
140+
writeI32 $ fromIntegral i
141+
writeI32 v
142+
143+
writeInstruction :: Instruction -> W ()
144+
writeInstruction = \case
145+
If {..} -> do
146+
writeType 500
147+
writeCondition condition
148+
writeReg srcReg
149+
writeBlock instructions
150+
Project {..} -> do
151+
writeType 501
152+
writeSelector srcSelector
153+
writeReg srcReg
154+
writeReg dstReg
155+
Extend {..} -> do
156+
writeType 502
157+
writeReg srcReg
158+
writeSelector dstSelector
159+
writeReg dstReg
160+
Move {..} -> do
161+
writeType 503
162+
writeReg srcReg
163+
writeReg dstReg
164+
RestrictedMove {..} -> do
165+
writeType 504
166+
writeReg srcReg
167+
writeReg dstReg
168+
ConditionalMove {..} -> do
169+
writeType 505
170+
writeReg srcReg
171+
writePredicate predicate
172+
writeReg dstReg
173+
Fetch {..} -> do
174+
writeType 506
175+
writeReg addressReg
176+
writeReg dstReg
177+
Store {..} -> do
178+
writeType 507
179+
writeReg srcReg
180+
writeMem address
181+
Update {..} -> do
182+
writeType 508
183+
writeReg srcReg
184+
writeReg addressReg
185+
RestrictedUpdate {..} -> do
186+
writeType 509
187+
writeReg srcReg
188+
writeReg addressReg
189+
ConditionalUpdate {..} -> do
190+
writeType 510
191+
writeReg srcReg
192+
writePredicate predicate
193+
writeReg addressReg
194+
Set {..} -> do
195+
writeType 511
196+
writeReg dstReg
197+
writeConstant constant
198+
199+
{-
200+
memory count i32
201+
register count i32
202+
start block id i32
203+
cmd count i32
204+
cmds ...
205+
block count i32
206+
blocks (ranges) ...
207+
intset count i32
208+
set size i32
209+
set elems ... [i32]
210+
-}
211+
212+
writeBlockItem :: Int32 -> Int -> W Int32
213+
writeBlockItem offset size = do
214+
let nextOffset = offset + fromIntegral size
215+
writeI32 $ offset
216+
writeI32 $ nextOffset
217+
pure nextOffset
218+
219+
encodeAbstractProgram :: AbstractProgram -> LBS.ByteString
220+
encodeAbstractProgram AbstractProgram {..} = toLazyByteString (envBuilder env) where
221+
env = flip execState emptyEnv $ do
222+
writeW32 _absMemoryCounter
223+
writeW32 _absRegisterCounter
224+
225+
-- start block id
226+
writeBlock _absInstructions
227+
228+
-- commands
229+
cmdCount <- gets envInstCount
230+
writeI32 $ fromIntegral cmdCount
231+
(blockSizes, blocks) <- gets $ unzip . Map.elems . envBuilderMap
232+
mapM emit blocks
233+
234+
-- bocks
235+
blkCount <- gets envBlockCount
236+
writeI32 $ fromIntegral blkCount
237+
foldM_ writeBlockItem 0 blockSizes
238+
239+
-- intsets
240+
{-
241+
setCount <- gets envTagSetCount
242+
writeI32 $ fromIntegral setCount
243+
sets <- gets envTagSets
244+
-}
245+
tagMap <- gets envTagMap
246+
writeI32 $ fromIntegral $ Map.size tagMap
247+
let sets = Map.elems $ Map.fromList [(i, s) | (s, i) <- Map.toList tagMap]
248+
249+
forM_ sets $ \s -> do
250+
writeI32 $ fromIntegral $ Set.size s
251+
forM_ (Set.toList s) (\(Tag t) -> writeI32 $ fromIntegral t)

0 commit comments

Comments
 (0)