using some templates with some hacky macros to allow matching on the contents of a std::variant, and getting the underlying value immediately.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import bisect | |
| from dataclasses import dataclass | |
| class Bound: | |
| def to_bound(self): return self | |
| def __lt__(self, other): | |
| return self <= other and self != other | |
| def __le__(self, other): | |
| if isinstance(self, Init) or isinstance(other, Done): return True | |
| if isinstance(self, Done) or isinstance(other, Init): return False |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- A lower bound in a totally ordered key-space k; corresponds to some part of an | |
| -- ordered sequence we can seek forward to. | |
| data Bound k = Init | Atleast !k | Greater !k | Done deriving (Show, Eq) | |
| instance Ord k => Ord (Bound k) where | |
| Init <= _ = True | |
| _ <= Done = True | |
| _ <= Init = False | |
| Done <= _ = False | |
| Atleast x <= Atleast y = x <= y | |
| Atleast x <= Greater y = x <= y |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {- cabal: | |
| build-depends: base, random, containers | |
| -} | |
| {-# LANGUAGE GADTs, ViewPatterns, GHC2021 #-} | |
| import Text.Printf | |
| import Control.Monad (liftM, ap) | |
| import Data.Function (on) | |
| import Data.List (sort, minimumBy) | |
| import System.Random | |
| import qualified Data.Map as M |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| open import Data.Nat | |
| open import Data.Nat.Properties | |
| open import Relation.Binary.PropositionalEquality | |
| open import Data.Product | |
| open import Data.Sum | |
| open import Relation.Nullary | |
| module MonoidNat3 where | |
| data Expr : Set where |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module CoDebruijn where | |
| open import Data.Product using (_×_; _,_; ∃-syntax) | |
| open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl) | |
| data Context : Set where | |
| O : Context | |
| 1+_ : Context → Context | |
| data Singleton : Context → Set where |
Here's a much more complete description of how I do SSA, beyond just how I do Phis.
This describes how I do SSA form, which avoids the need to have any coupling between CFG data structures and SSA data structures.
Let's first define a syntax for SSA and some terminology. Here's an example SSA node:
A = Add(B, C)
In reality, this will be a single object in your in-memory representation, and the names are really addresses of those objects. So, this node has an "implicit variable" called A; it's the variable that is implicitly assigned to when you execute the node. If you then do:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (** {1 Syntax} *) | |
| (** Expressions. *) | |
| type expr = | |
| | Var of cont * int | |
| (** Local references. | |
| Thorin is a "blockless" IR, so we can reference arguments of | |
| other nodes by adding a data dependency edge, which implicitly | |
| nests the two nodes. *) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| type var = string | |
| type term = Var of var | |
| | Lam of var * term | |
| | App of term * term | |
| | Fix of var * term (* only used for functions *) | |
| | Lit of int | |
| type value = Int of int | |
| | Fun of (value -> value) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import System.Environment (getArgs) | |
| import Control.Monad (guard, forM_) | |
| import System.Random (RandomGen) | |
| import qualified System.Random as Random | |
| import Data.Map.Strict (Map) | |
| import qualified Data.Map.Strict as Map |