23 | module ControlFlow.CFG.Simple
25 | import public ControlFlow.Edge
29 | Neighbors : Type -> Type
30 | Neighbors a = List a
38 | Vertex : Type -> Type
39 | Vertex a = (v : a) -> (ins : Neighbors a) -> (outs : Neighbors a) -> Type
44 | Edges : Type -> Type
45 | Edges a = List (Edge a)
52 | data CFG : (vertex : Vertex a) -> (ins : Edges a) -> (outs : Edges a) -> Type where
55 | Empty : CFG vertex edges edges
59 | : {0 vertex : Vertex a}
60 | -> {vins, vouts : Neighbors a}
61 | -> vertex v vins vouts
62 | -> CFG vertex (vins ~~> v) (v ~>> vouts)
68 | : {ins, outs, loopIns, loopOuts : Edges a}
69 | -> (node : CFG vertex (ins ++ loopOuts) (loopIns ++ outs))
70 | -> (loop : CFG vertex loopIns loopOuts)
71 | -> CFG vertex ins outs
79 | : (pre : CFG vertex ins edges)
80 | -> (post : CFG vertex edges outs)
81 | -> CFG vertex ins outs
89 | : (left : CFG vertex ins outs)
90 | -> (right : CFG vertex ins' outs')
91 | -> CFG vertex (ins ++ ins') (outs ++ outs')
96 | : {ins, ins' : Edges a}
97 | -> CFG vertex (ins ++ ins') outs
98 | -> CFG vertex (ins' ++ ins) outs
102 | : {outs, outs' : List (Edge a)}
103 | -> CFG vertex ins (outs ++ outs')
104 | -> CFG vertex ins (outs' ++ outs)
106 | export infixr 4 |-|
110 | : CFG vertex ins outs
111 | -> CFG vertex ins' outs'
112 | -> CFG vertex (ins ++ ins') (outs ++ outs')
115 | export infixr 5 *->
119 | : CFG vertex ins edges
120 | -> CFG vertex edges outs
121 | -> CFG vertex ins outs
127 | : {0 vertex : Vertex a}
128 | -> {vins, vouts : Neighbors a}
129 | -> vertex v vins vouts
130 | -> CFG vertex (v ~>> vouts) gouts
131 | -> CFG vertex (vins ~~> v) gouts
132 | prepend v g = (SingleVertex v) *-> g
136 | : {vins, vouts : Neighbors a}
138 | -> CFG vertex gins (vins ~~> v)
139 | -> vertex v vins vouts
140 | -> CFG vertex gins (v ~>> vouts)
141 | append g v = g *-> (SingleVertex v)
144 | : {0 vertex : Vertex a}
145 | -> {vins : Neighbors a}
148 | -> (pre : vertex v vins [w, w'])
149 | -> (left : CFG vertex [v ~> w] louts)
150 | -> (right : CFG vertex [v ~> w'] routs)
151 | -> CFG vertex (vins ~~> v) (louts ++ routs)
152 | branch pre left right = pre `prepend` (left |-| right)
155 | : {0 vertex : Vertex a}
156 | -> {vins, vouts : Neighbors a}
157 | -> {w, w', u, u' : a}
159 | -> (pre : vertex v vins [w, w'])
160 | -> (left : CFG vertex [v ~> w] [u ~> t])
161 | -> (right : CFG vertex [v ~> w'] [u' ~> t])
162 | -> (post : vertex t [u, u'] vouts)
163 | -> CFG vertex (vins ~~> v) (t ~>> vouts)
164 | fullBranch pre left right post = (branch pre left right) `append` post
175 | : {ls, rs : List (Edge a)}
176 | -> (node : CFG vertex ins (ls ++ rs))
177 | -> (branch : CFG vertex ls ls')
178 | -> CFG vertex ins (ls' ++ rs)
179 | lbranch node branch = node *-> (branch |-| Empty)
190 | : {ls, rs : List (Edge a)}
191 | -> (node : CFG vertex ins (ls ++ rs))
192 | -> (branch : CFG vertex rs rs')
193 | -> CFG vertex ins (ls ++ rs')
194 | rbranch node branch = node *-> (Empty |-| branch)
205 | : {ls, rs : Edges a}
206 | -> (branch : CFG vertex ls ls')
207 | -> (node : CFG vertex (ls' ++ rs) outs)
208 | -> CFG vertex (ls ++ rs) outs
209 | lmerge branch node = (branch |-| Empty) *-> node
220 | : {ls, rs : Edges a}
221 | -> (branch : CFG vertex rs rs')
222 | -> (node : CFG vertex (ls ++ rs') outs)
223 | -> CFG vertex (ls ++ rs) outs
224 | rmerge branch node = (Empty |-| branch) *-> node
228 | : {0 vertex : Vertex a}
229 | -> {ins, outs : Neighbors a}
230 | -> vertex v ins outs
231 | -> CFG vertex (ins ~~> v) (v ~>> outs)
232 | initGraph v = SingleVertex v
238 | -> {0 vertex, vertex' : Vertex a}
239 | -> {0 ins, outs : Edges a}
241 | -> {vins, vouts : Neighbors a}
242 | -> vertex v vins vouts
243 | -> vertex' v vins vouts
245 | -> CFG vertex ins outs
246 | -> CFG vertex' ins outs
248 | vmap f Empty = Empty
249 | vmap f (SingleVertex v) = SingleVertex (f v)
250 | vmap f (Cycle node loop) = Cycle (vmap f node) (vmap f loop)
251 | vmap f (Series g g') = Series (vmap f g) (vmap f g')
252 | vmap f (Parallel g g') = Parallel (vmap f g) (vmap f g')
253 | vmap f (IFlip g) = IFlip (vmap f g)
254 | vmap f (OFlip g) = OFlip (vmap f g)