Wrap generated graphs to ensure entry and exit nodes have no extra edges
Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
		
							parent
							
								
									69d1ecebae
								
							
						
					
					
						commit
						734e82ff6d
					
				| @ -55,16 +55,16 @@ record Program : Set where | ||||
|         rootStmt : Stmt | ||||
| 
 | ||||
|     graph : Graph | ||||
|     graph = buildCfg rootStmt | ||||
|     graph = wrap (buildCfg rootStmt) | ||||
| 
 | ||||
|     State : Set | ||||
|     State = Graph.Index graph | ||||
| 
 | ||||
|     initialState : State | ||||
|     initialState = proj₁ (buildCfg-input rootStmt) | ||||
|     initialState = proj₁ (wrap-input (buildCfg rootStmt)) | ||||
| 
 | ||||
|     finalState : State | ||||
|     finalState = proj₁ (buildCfg-output rootStmt) | ||||
|     finalState = proj₁ (wrap-output (buildCfg rootStmt)) | ||||
| 
 | ||||
|     private | ||||
|         vars-Set : StringSet | ||||
|  | ||||
| @ -112,6 +112,9 @@ singleton bss = record | ||||
|     ; outputs = zero ∷ [] | ||||
|     } | ||||
| 
 | ||||
| wrap : Graph → Graph | ||||
| wrap g = singleton [] ↦ g ↦ singleton [] | ||||
| 
 | ||||
| buildCfg : Stmt → Graph | ||||
| buildCfg ⟨ bs₁ ⟩ = singleton (bs₁ ∷ []) | ||||
| buildCfg (s₁ then s₂) = buildCfg s₁ ↦ buildCfg s₂ | ||||
|  | ||||
| @ -18,22 +18,11 @@ open import Relation.Binary.PropositionalEquality as Eq using (_≡_; refl; sym) | ||||
| 
 | ||||
| open import Utils using (x∈xs⇒fx∈fxs; ∈-cartesianProduct; concat-∈) | ||||
| 
 | ||||
| wrap-input : ∀ (g : Graph) → Σ (Graph.Index (wrap g)) (λ idx → Graph.inputs (wrap g) ≡ idx ∷ []) | ||||
| wrap-input g = (_ , refl) | ||||
| 
 | ||||
| buildCfg-input : ∀ (s : Stmt) → let g = buildCfg s in Σ (Graph.Index g) (λ idx → Graph.inputs g ≡ idx ∷ []) | ||||
| buildCfg-input ⟨ bs₁ ⟩ = (zero , refl) | ||||
| buildCfg-input (s₁ then s₂) | ||||
|     with (idx , p) ← buildCfg-input s₁ rewrite p = (_ , refl) | ||||
| buildCfg-input (if _ then s₁ else s₂) = (zero , refl) | ||||
| buildCfg-input (while _ repeat s) | ||||
|     with (idx , p) ← buildCfg-input s rewrite p = (_ , refl) | ||||
| 
 | ||||
| buildCfg-output : ∀ (s : Stmt) → let g = buildCfg s in Σ (Graph.Index g) (λ idx → Graph.outputs g ≡ idx ∷ []) | ||||
| buildCfg-output ⟨ bs₁ ⟩ = (zero , refl) | ||||
| buildCfg-output (s₁ then s₂) | ||||
|     with (idx , p) ← buildCfg-output s₂ rewrite p = (_ , refl) | ||||
| buildCfg-output (if _ then s₁ else s₂) = (_ , refl) | ||||
| buildCfg-output (while _ repeat s) | ||||
|     with (idx , p) ← buildCfg-output s rewrite p = (_ , refl) | ||||
| wrap-output : ∀ (g : Graph) → Σ (Graph.Index (wrap g)) (λ idx → Graph.outputs (wrap g) ≡ idx ∷ []) | ||||
| wrap-output g = (_ , refl) | ||||
| 
 | ||||
| Trace-∙ˡ : ∀ {g₁ g₂ : Graph} {idx₁ idx₂ : Graph.Index g₁} {ρ₁ ρ₂ : Env} → | ||||
|            Trace {g₁} idx₁ idx₂ ρ₁ ρ₂ → | ||||
| @ -224,6 +213,10 @@ EndToEndTrace-singleton ρ₁⇒ρ₂ = record | ||||
| EndToEndTrace-singleton[] : ∀ (ρ : Env) → EndToEndTrace {singleton []} ρ ρ | ||||
| EndToEndTrace-singleton[] env = EndToEndTrace-singleton [] | ||||
| 
 | ||||
| EndToEndTrace-wrap : ∀ {g : Graph} {ρ₁ ρ₂ : Env} → | ||||
|                      EndToEndTrace {g} ρ₁ ρ₂ → EndToEndTrace {wrap g} ρ₁ ρ₂ | ||||
| EndToEndTrace-wrap {g} {ρ₁} {ρ₂} etr = EndToEndTrace-singleton[] ρ₁ ++ etr ++ EndToEndTrace-singleton[] ρ₂ | ||||
| 
 | ||||
| buildCfg-sufficient : ∀ {s : Stmt} {ρ₁ ρ₂ : Env} → ρ₁ , s ⇒ˢ ρ₂ → | ||||
|                       EndToEndTrace {buildCfg s} ρ₁ ρ₂ | ||||
| buildCfg-sufficient (⇒ˢ-⟨⟩ ρ₁ ρ₂ bs ρ₁,bs⇒ρ₂) = | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user