0 | module ControlFlow.CFG.Conversion
 1 |
 2 | import ControlFlow.CFG
 3 | import ControlFlow.CFG.Simple
 4 |
 5 | public export
 6 | Simplify : CFG.Vertex a -> Simple.Vertex a
 7 | Simplify vertex v ins outs = vertex v (Just ins) (Just outs)
 8 |
 9 | public export
10 | Unsimplify : Simple.Vertex a -> CFG.Vertex a
11 | Unsimplify vertex v _          Nothing     = Void
12 | Unsimplify vertex v Nothing    _           = Void
13 | Unsimplify vertex v (Just ins) (Just outs) = vertex v ins outs
14 |
15 | ||| Convert a control-flow graph (`CFG.CFG`) with defined inputs and outputs
16 | ||| into a simplified control-flow graph (`CFG.Simple.CFG`)
17 | export
18 | simplify : CFG vertex (Defined ins) (Defined outs) -> CFG (Simplify vertex) ins outs
19 | simplify (SingleVertex {vins = Just ins, vouts = Just outs} v) = SingleVertex v
20 | simplify Empty             = Empty
21 | simplify (Cycle node loop) = Cycle (simplify node) (simplify loop)
22 | simplify (Series g g')     = Series (simplify g) (simplify g')
23 | simplify (Parallel g g')   = Parallel (simplify g) (simplify g')
24 | simplify (IFlip g)         = IFlip (simplify g)
25 | simplify (OFlip g)         = OFlip (simplify g)
26 |
27 | simplify (SingleVertex {vins  = Nothing} v) impossible
28 | simplify (SingleVertex {vouts = Nothing} v) impossible
29 |
30 | ||| Convert a simplified control-flow graph (`CFG.Simple.CFG`) into an
31 | ||| "unsimplified" control-flow graph (`CFG.CFG`) with defined inputs and
32 | ||| outputs
33 | export
34 | unsimplify : Simple.CFG vertex ins outs -> CFG (Unsimplify vertex) (Defined ins) (Defined outs)
35 | unsimplify (SingleVertex {vins, vouts} v) = SingleVertex {vins = Just vins, vouts = Just vouts} v
36 | unsimplify Empty             = Empty
37 | unsimplify (Cycle node loop) = Cycle (unsimplify node) (unsimplify loop)
38 | unsimplify (Series g g')     = Series (unsimplify g) (unsimplify g')
39 | unsimplify (Parallel g g')   = Parallel (unsimplify g) (unsimplify g')
40 | unsimplify (IFlip g)         = IFlip (unsimplify g)
41 | unsimplify (OFlip g)         = OFlip (unsimplify g)
42 |