From 00a0ce9082b4cc1389815defcc806efd4a9b80f4 Mon Sep 17 00:00:00 2001 From: Greg Brown Date: Mon, 18 Apr 2022 15:05:24 +0100 Subject: Do a big refactor. - Replace the decidable predicates on expressions and statements with separate data types. - Reorganise the Hoare logic semantics to remove unnecessary definitions. - Make liberal use of modules to group related definitions together. - Unify the types for denotational and Hoare logic semantics. - Make bits an abstraction of array types. --- src/Helium/Instructions/Base.agda | 240 +++++++++++++------------ src/Helium/Instructions/Instances/Barrett.agda | 6 +- 2 files changed, 132 insertions(+), 114 deletions(-) (limited to 'src/Helium/Instructions') diff --git a/src/Helium/Instructions/Base.agda b/src/Helium/Instructions/Base.agda index d157d5a..3e1bb5f 100644 --- a/src/Helium/Instructions/Base.agda +++ b/src/Helium/Instructions/Base.agda @@ -11,18 +11,25 @@ module Helium.Instructions.Base where open import Data.Bool as Bool using (true; false) open import Data.Fin as Fin using (Fin; Fin′; zero; suc; toℕ) open import Data.Fin.Patterns +open import Data.Integer as ℤ using (1ℤ; 0ℤ; -1ℤ) open import Data.Nat as ℕ using (ℕ; zero; suc) import Data.Nat.Properties as ℕₚ +open import Data.Product using (uncurry) open import Data.Sum using ([_,_]′; inj₂) open import Data.Vec as Vec using (Vec; []; _∷_) open import Data.Vec.Relation.Unary.All using (All; []; _∷_) open import Function using (_$_) open import Helium.Data.Pseudocode.Core as Core public - hiding (module Code) import Helium.Instructions.Core as Instr import Relation.Binary.PropositionalEquality as P open import Relation.Nullary.Decidable.Core using (True) +private + variable + k m n : ℕ + t : Type + Γ : Vec Type n + --- Types beat : Type @@ -43,75 +50,85 @@ State = array (bits 32) 32 -- S ∷ beat -- _BeatId ∷ [] -open Core.Code State public - --- References -- Direct from State -S : ∀ {n Γ} → Expression {n} Γ (array (bits 32) 32) +S : Reference State Γ (array (bits 32) 32) S = state 0F -R : ∀ {n Γ} → Expression {n} Γ (array (bits 32) 16) +R : Reference State Γ (array (bits 32) 16) R = state 1F -VPR-P0 : ∀ {n Γ} → Expression {n} Γ (bits 16) +VPR-P0 : Reference State Γ (bits 16) VPR-P0 = state 2F -VPR-mask : ∀ {n Γ} → Expression {n} Γ (bits 8) +VPR-mask : Reference State Γ (bits 8) VPR-mask = state 3F -FPSCR-QC : ∀ {n Γ} → Expression {n} Γ bit +FPSCR-QC : Reference State Γ bit FPSCR-QC = state 4F -AdvanceVPTState : ∀ {n Γ} → Expression {n} Γ bool +AdvanceVPTState : Reference State Γ bool AdvanceVPTState = state 5F -BeatId : ∀ {n Γ} → Expression {n} Γ beat +BeatId : Reference State Γ beat BeatId = state 6F -- Indirect -group : ∀ {n Γ t k} m → Expression {n} Γ (asType t (k ℕ.* suc m)) → Expression Γ (array (asType t k) (suc m)) -group {k = k} zero x = [ cast (P.trans (ℕₚ.*-comm k 1) (ℕₚ.+-comm k 0)) x ] -group {k = k} (suc m) x = group m (slice x′ (lit (Fin.fromℕ k ′f))) ∶ [ slice (cast (ℕₚ.+-comm k _) x′) (lit (zero ′f)) ] +index : Expression State Γ (array t (suc m)) → Expression State Γ (fin (suc m)) → Expression State Γ t +index {m = m} x i = unbox (slice (cast (ℕₚ.+-comm 1 m) x) i) + +*index : Reference State Γ (array t (suc m)) → Expression State Γ (fin (suc m)) → Reference State Γ t +*index {m = m} x i = unbox (slice (cast (ℕₚ.+-comm 1 m) x) i) + +*index-group : Reference State Γ (array t (k ℕ.* suc m)) → Expression State Γ (fin (suc m)) → Reference State Γ (array t k) +*index-group {k = k} {m = m} x i = slice (cast eq x) (fin reindex (tup (i ∷ []))) where - x′ = cast (P.trans (ℕₚ.*-comm k _) (P.cong (k ℕ.+_) (ℕₚ.*-comm _ k))) x + eq = P.trans (ℕₚ.*-comm k (suc m)) (ℕₚ.+-comm k (m ℕ.* k)) + + reindex : ∀ {m n} → Fin (suc m) → Fin (suc (m ℕ.* n)) + reindex {m} {n} 0F = Fin.inject+ (m ℕ.* n) 0F + reindex {suc m} {n} (suc i) = Fin.cast (ℕₚ.+-suc n (m ℕ.* n)) (Fin.raise n (reindex i)) -join : ∀ {n Γ t k m} → Expression {n} Γ (array (asType t k) (suc m)) → Expression Γ (asType t (k ℕ.* suc m)) -join {k = k} {zero} x = cast (P.trans (ℕₚ.+-comm 0 k) (ℕₚ.*-comm 1 k)) (unbox x) -join {k = k} {suc m} x = cast eq (join (slice x (lit (Fin.fromℕ 1 ′f))) ∶ unbox (slice {i = suc m} (cast (ℕₚ.+-comm 1 _) x) (lit (zero ′f)))) +index-group : Expression State Γ (array t (k ℕ.* suc m)) → Expression State Γ (fin (suc m)) → Expression State Γ (array t k) +index-group {k = k} {m = m} x i = slice (cast eq x) (fin reindex (tup (i ∷ []))) where - eq = P.trans (P.cong (k ℕ.+_) (ℕₚ.*-comm k (suc m))) (ℕₚ.*-comm (suc (suc m)) k) + eq = P.trans (ℕₚ.*-comm k (suc m)) (ℕₚ.+-comm k (m ℕ.* k)) -index : ∀ {n Γ t m} → Expression {n} Γ (asType t (suc m)) → Expression Γ (fin (suc m)) → Expression Γ (elemType t) -index {m = m} x i = unbox (slice (cast (ℕₚ.+-comm 1 m) x) i) + reindex : ∀ {m n} → Fin (suc m) → Fin (suc (m ℕ.* n)) + reindex {m} {n} 0F = Fin.inject+ (m ℕ.* n) 0F + reindex {suc m} {n} (suc i) = Fin.cast (ℕₚ.+-suc n (m ℕ.* n)) (Fin.raise n (reindex i)) + +Q[_,_] : Expression State Γ (fin 8) → Expression State Γ (fin 4) → Reference State Γ (bits 32) +Q[ i , j ] = *index S (fin (uncurry Fin.combine) (tup (i ∷ j ∷ []))) -Q : ∀ {n Γ} → Expression {n} Γ (array (array (bits 32) 4) 8) -Q = group 7 S +elem : ∀ m → Expression State Γ (array t (suc k ℕ.* m)) → Expression State Γ (fin (suc k)) → Expression State Γ (array t m) +elem {k = k} zero x i = cast (ℕₚ.*-comm k 0) x +elem {k = k} (suc m) x i = index-group (cast (ℕₚ.*-comm (suc k) (suc m)) x) i -elem : ∀ {n Γ t k} m → Expression {n} Γ (asType t (k ℕ.* m)) → Expression Γ (fin k) → Expression Γ (asType t m) -elem {k = zero} m x i = abort i -elem {k = suc k} zero x i = cast (ℕₚ.*-comm k 0) x -elem {k = suc k} (suc m) x i = index (group k (cast (ℕₚ.*-comm (suc k) (suc m)) x)) i +*elem : ∀ m → Reference State Γ (array t (suc k ℕ.* m)) → Expression State Γ (fin (suc k)) → Reference State Γ (array t m) +*elem {k = k} zero x i = cast (ℕₚ.*-comm k 0) x +*elem {k = k} (suc m) x i = *index-group (cast (ℕₚ.*-comm (suc k) (suc m)) x) i --- Other utiliies -hasBit : ∀ {n Γ m} → Expression {n} Γ (bits (suc m)) → Expression Γ (fin (suc m)) → Expression Γ bool -hasBit {n} x i = index x i ≟ lit (true ′x) +hasBit : Expression State Γ (bits (suc m)) → Expression State Γ (fin (suc m)) → Expression State Γ bool +hasBit {n} x i = index x i ≟ lit true -sliceⁱ : ∀ {n Γ m} → ℕ → Expression {n} Γ int → Expression Γ (bits m) -sliceⁱ {m = zero} n i = lit ([] ′xs) -sliceⁱ {m = suc m} n i = sliceⁱ (suc n) i ∶ [ get n i ] +sliceⁱ : ℕ → Expression State Γ int → Expression State Γ (bits m) +sliceⁱ {m = zero} n i = lit [] +sliceⁱ {m = suc m} n i = sliceⁱ (suc n) i ∶ [ getBit n i ] --- Functions -Int : ∀ {n} → Function (bits n ∷ bool ∷ []) int +Int : Function State (bits n ∷ bool ∷ []) int Int = skip ∙return (if var 1F then uint (var 0F) else sint (var 0F)) -- arguments swapped, pred n -SignedSatQ : ∀ n → Function (int ∷ []) (tuple 2 (bits (suc n) ∷ bool ∷ [])) -SignedSatQ n = declare (lit (true ′b)) ( +SignedSatQ : ∀ n → Function State (int ∷ []) (tuple (bits (suc n) ∷ bool ∷ [])) +SignedSatQ n = declare (lit true) ( if max >3 (tup ((var 3F) ∷ []))) then - FPSCR-QC ≔ lit (true ′x)))) + FPSCR-QC ≔ lit true))) where open Instr.VecOp₂ d - e*esize>>3 : All Fin (toℕ elements ∷ []) → Fin 4 - e*esize>>3 (x ∷ []) = helper size x + e*esize>>3 : Fin (toℕ elements) → Fin 4 + e*esize>>3 x = helper size x where helper : ∀ size → Fin′ (Instr.Size.elements size) → Fin 4 helper Instr.8bit i = Fin.combine i (zero {0}) helper Instr.16bit i = Fin.combine i (zero {1}) helper Instr.32bit i = Fin.combine i zero -vqdmulh : Instr.VQDMulH → Procedure [] -vqdmulh d = vqr?dmulh d (skip ∙return lit (2 ′i) * var 0F * var 1F >> toℕ esize) +vqdmulh : Instr.VQDMulH → Procedure State [] +vqdmulh d = vqr?dmulh d (skip ∙return lit (ℤ.+ 2) * var 0F * var 1F >> toℕ esize) where open Instr.VecOp₂ d using (esize) -vqrdmulh : Instr.VQRDMulH → Procedure [] -vqrdmulh d = vqr?dmulh d (skip ∙return lit (2 ′i) * var 0F * var 1F + lit (1 ′i) << toℕ esize-1 >> toℕ esize) +vqrdmulh : Instr.VQRDMulH → Procedure State [] +vqrdmulh d = vqr?dmulh d (skip ∙return lit (ℤ.+ 2) * var 0F * var 1F + lit 1ℤ << toℕ esize-1 >> toℕ esize) where open Instr.VecOp₂ d using (esize; esize-1) diff --git a/src/Helium/Instructions/Instances/Barrett.agda b/src/Helium/Instructions/Instances/Barrett.agda index 606a9e9..b913972 100644 --- a/src/Helium/Instructions/Instances/Barrett.agda +++ b/src/Helium/Instructions/Instances/Barrett.agda @@ -22,11 +22,11 @@ open import Helium.Instructions.Core -- | z | < 2 ^ 31 -- Computes: -- z mod n -barret : (m -n : Expression [] (bits 32)) (t z : VecReg) (im : GenReg) → Procedure [] +barret : (m -n : Expression State [] (bits 32)) (t z : VecReg) (im : GenReg) → Procedure State [] barret m -n t z im = - index R (lit (im ′f)) ≔ m ∙ + *index R (lit im) ≔ m ∙ invoke vqrdmulh-s32,t,z,m [] ∙ - index R (lit (im ′f)) ≔ -n ∙ + *index R (lit im) ≔ -n ∙ invoke vmla-s32,z,t,-n [] ∙end where vqrdmulh-s32,t,z,m = -- cgit v1.2.3