Simplify operations used for constructing graphs

Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
Danila Fedorin 2024-04-28 12:40:50 -07:00
parent 07550bc214
commit b4d395767d
1 changed files with 13 additions and 1 deletions

View File

@ -84,6 +84,18 @@ loop g = record g
List.cartesianProduct (Graph.outputs g) (Graph.inputs g)
}
optional : Graph → Graph
optional g = record
{ size = 2 Nat.+ Graph.size g
; nodes = [] ∷ [] ∷ Graph.nodes g
; edges = (2 ↑ʳᵉ Graph.edges g) List.++
List.map (zero ,_) (2 ↑ʳⁱ Graph.inputs g) List.++
List.map (_, suc zero) (2 ↑ʳⁱ Graph.outputs g) List.++
((zero , suc zero) ∷ [])
; inputs = zero ∷ []
; outputs = (suc zero) ∷ []
}
infixr 5 _skipto_
_skipto_ : Graph → Graph → Graph
_skipto_ g₁ g₂ = record (g₁ ∙ g₂)
@ -110,4 +122,4 @@ buildCfg : Stmt → Graph
buildCfg ⟨ bs₁ ⟩ = singleton (bs₁ ∷ [])
buildCfg (s₁ then s₂) = buildCfg s₁ ↦ buildCfg s₂
buildCfg (if _ then s₁ else s₂) = singleton [] ↦ (buildCfg s₁ ∙ buildCfg s₂) ↦ singleton []
buildCfg (while _ repeat s) = (loop (singleton [] ↦ buildCfg s)) skipto (singleton [])
buildCfg (while _ repeat s) = optional (loop (buildCfg s))