From Haskell to Hardware via CCCs Conal Elliott Tabula August, - - PowerPoint PPT Presentation

from haskell to hardware via cccs
SMART_READER_LITE
LIVE PREVIEW

From Haskell to Hardware via CCCs Conal Elliott Tabula August, - - PowerPoint PPT Presentation

From Haskell to Hardware via CCCs Conal Elliott Tabula August, 2014 Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 1 / 57 Tabula Founded by Steve Teig about 10 years ago. Post-FPGA reconfigurable hardware.


slide-1
SLIDE 1

From Haskell to Hardware via CCCs

Conal Elliott

Tabula

August, 2014

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 1 / 57

slide-2
SLIDE 2

Tabula

Founded by Steve Teig about 10 years ago. Post-FPGA reconfigurable hardware. Spacetime architecture:

3D for shorter paths Implemented by rapid reconfiguration (2GHz) Minkowski spacetime (special relativity) Spacetime layout with causality constraints Very high sustained throughput

Tremendous flexibility for moving computations in space & time Program in a non-sequential language: Haskell Compiler developed openly and shared freely

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 2 / 57

slide-3
SLIDE 3

Example

square :: Num a ñ a Ñ a square a “ a ˚ a sumSquare :: pFunctor f , Foldable f , Num aq ñ f a Ñ a sumSquare “ sum ˝ fmap square

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 3 / 57

slide-4
SLIDE 4

sumSquare :: Tree2 Int Ñ Int

sumSquare “ sum ˝ fmap square

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 Out 32 Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 4 / 57

slide-5
SLIDE 5

sumSquare :: Tree2 Int Ñ Int

module sumSquare-t2 (In_0, In_1, In_2, In_3, Out); input [0:31] In_0; input [0:31] In_1; input [0:31] In_2; input [0:31] In_3;

  • utput [0:31] Out;

wire [0:31] w_mul_I1; wire [0:31] w_mul_I2; wire [0:31] w_mul_I3; wire [0:31] w_mul_I4; wire [0:31] w_add_I5; wire [0:31] w_add_I6; wire [0:31] w_add_I7; assign w_mul_I1 = In_0 * In_0; assign w_mul_I2 = In_1 * In_1; assign w_mul_I3 = In_2 * In_2; assign w_mul_I4 = In_3 * In_3; assign w_add_I5 = w_mul_I1 + w_mul_I2; assign w_add_I6 = w_mul_I3 + w_mul_I4; assign w_add_I7 = w_add_I5 + w_add_I6; assign Out = w_add_I7; endmodule

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 5 / 57

slide-6
SLIDE 6

sumSquare :: Tree3 Int Ñ Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 6 / 57

slide-7
SLIDE 7

sumSquare :: Tree4 Int Ñ Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 add 32 add 32 32 add 32 add 32 32 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 7 / 57

slide-8
SLIDE 8

How it works

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 8 / 57

slide-9
SLIDE 9

Overall plan

Convert Haskell to Core (GHC). Monomorphize. Convert to abstract vocabulary. Interpret as circuits. Synthesize & optimize with existing HDL machinery. Initial simplifications: Shape-typed data Combinational

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 9 / 57

slide-10
SLIDE 10

GHC Core

data Expr b

  • - “b” for the type of binders,

“ Var Id | Lit Literal | App pExpr bq pExpr bq | Lam b pExpr bq | Let pBind bq pExpr bq | Case pExpr bq b Type rAlt bs | Cast pExpr bq Coercion | Type Type type Alt b “ pAltCon, rbs, Expr bq data AltCon “ DataAlt DataCon | LitAlt Literal | DEFAULT data Bind b “ NonRec b pExpr bq | Rec rpb, Expr bqs

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 10 / 57

slide-11
SLIDE 11

Overloading lambda

Powerful abstraction mechanisms: Lambda/application Type classes Can we use type classes to generalize lambda & application?

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 11 / 57

slide-12
SLIDE 12

(Bi-)Cartesian closed categories

Category: identity and composition Cartesian: products Co-Cartesian: coproducts (“sums”) Closed: exponentials (arrows as “values”) Suffices for translating typed lambda calculus (J. Lambek, 1980).

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 12 / 57

slide-13
SLIDE 13

Category

Interface: class Category p❀q where id :: a ❀ a p˝q :: pb ❀ cq Ñ pa ❀ bq Ñ pa ❀ cq Laws: id ˝ f ” f g ˝ id ” g ph ˝ gq ˝ f ” h ˝ pg ˝ f q

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 13 / 57

slide-14
SLIDE 14

Products

class Category p❀q ñ ProductCat p❀q where type a ˆ❀ b exl :: pa ˆ❀ bq ❀ a exr :: pa ˆ❀ bq ❀ b pŸq :: pa ❀ cq Ñ pa ❀ dq Ñ pa ❀ pc ˆ❀ dqq p ˆ q :: pa ❀ cq Ñ pb ❀ dq Ñ ppa ˆ❀ bq ❀ pc ˆ❀ dqq f ˆg “ pf ˝ exlq Ÿ pg ˝ exrq Laws: exl ˝ pf Ÿ gq ” f exr ˝ pf Ÿ gq ” g exl ˝ h Ÿ exr ˝ h ” h exl Ÿ exr ” id pf ˆgq ˝ ph Ÿ kq ” pf ˝ hq Ÿ pg ˝ kq id ˆid ” id pf ˆgq ˝ phˆkq ” pf ˝ hqˆpg ˝ kq pf Ÿ gq ˝ h ” pf ˝ hq Ÿ pg ˝ hq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 14 / 57

slide-15
SLIDE 15

Coproducts

class Category p❀q ñ CoproductCat p❀q where type a `

❀ b

inl :: a ❀ pa `

❀ bq

inr :: b ❀ pa `

❀ bq

pŹq :: pa ❀ cq Ñ pb ❀ cq Ñ ppa `

❀ bq ❀ cq

p ` q :: pa ❀ cq Ñ pb ❀ dq Ñ ppa `

❀ bq ❀ pc ` ❀ dqq

f `g “ pinl ˝ f q Ź pinr ˝ gq Laws (dual to product): pf Ź gq ˝ inl ” f pf Ź gq ˝ inr ” g h ˝ inl Ź h ˝ inr ” h inl Ź inr ” id ph Ź kq ˝ pf `gq ” ph ˝ f q Ź pk ˝ gq id `id ” id ph`kq ˝ pf `gq ” ph ˝ f q`pk ˝ gq h ˝ pf Ź gq ” ph ˝ f q Ź ph ˝ gq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 15 / 57

slide-16
SLIDE 16

Exponentials

class ProductCat p❀q ñ ClosedCat p❀q where type a ñ

❀ b

apply :: ppa ñ

❀ bq ˆ❀ aq ❀ b

curry :: ppa ˆ❀ bq ❀ cq Ñ pa ❀ pb ñ

❀ cqq

uncurry :: pa ❀ pb ñ

❀ cqq Ñ pa ˆ❀ bq ❀ c Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 16 / 57

slide-17
SLIDE 17

Lambda terms

data E :: ˚ Ñ ˚ where Var :: V a Ñ E a Const :: Prim a Ñ E a App :: E pa Ñ bq Ñ E a Ñ E b Lam :: Pat a Ñ E b Ñ E pa Ñ bq data Pat :: ˚ Ñ ˚ where UnitPat :: Pat pq VarPat :: V a Ñ Pat a PairPat :: Pat a Ñ Pat b Ñ Pat pa ˆ bq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 17 / 57

slide-18
SLIDE 18

Lambda to CCC

pλp Ñ kq const k

  • - v not free in k

pλp Ñ vq ...

  • - accessor

pλp Ñ u vq apply ˝ ppλp Ñ uq Ÿ pλp Ñ vqq pλp Ñ λq Ñ uq curry pλpp, qq Ñ uq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 18 / 57

slide-19
SLIDE 19

Lambda to CCC

pλp Ñ kq const k

  • - v not free in k

pλp Ñ vq ...

  • - accessor

pλp Ñ u vq apply ˝ ppλp Ñ uq Ÿ pλp Ñ vqq pλp Ñ λq Ñ uq curry pλpp, qq Ñ uq convert :: CCC p❀q ñ Pat a Ñ E b Ñ pa ❀ bq convert pConst xq “ constArrow x convert p pVar vq “ convertVar p v convert p pApp u vq “ apply ˝ pconvert p u Ÿ convert p vq convert p pLam q eq “ curry pconvert pPairPat p qq eq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 18 / 57

slide-20
SLIDE 20

Circuit CCC

data Comp “ @a b.Comp pPrim a bq pBuses aq pBuses bq type CircuitM “ WriterT pSeq Compq pState BusSupplyq newtype a ֌ b “ Circ pBuses a Ñ CircuitM pBuses bqq instance Category p֌q where ... instance ProductCat p֌q where ... instance ClosedCat p֌q where ...

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 19 / 57

slide-21
SLIDE 21

Examples

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 20 / 57

slide-22
SLIDE 22

sumSquare :: Tree2 Int Ñ Int

sumSquare “ sum ˝ fmap square

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 Out 32 Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 21 / 57

slide-23
SLIDE 23

sumSquare :: Tree2 Int Ñ Int

uncurry (apply . (curry (apply . (curry (apply . (curry (apply . (curry (curry (apply . (curry (apply . (apply . (curry (curry (uncurry add) . exr) . it &&& apply . (curry (repr . exr) . it &&& apply . (((((id . exr) . exl) . exl) . exl) . id *** (id . exl) . id))) &&& apply . (curry (repr . exr) . it &&& apply . (((((id . exr) . exl) . exl) . exl) . id *** (id . exr) . id)))) &&& apply . (curry (repr . exr) . it &&& apply . (curry (apply . (curry (abst . exr) . it &&& apply . (apply . (curry (curry id . exr) . it &&& apply . (((id . exr) . exl) . id *** (id . exl) . id)) &&& apply . (((id . exr) . exl) . id *** (id . exr) . id)))) &&& apply . (curry (repr . exr) . it &&& apply . (curry (repr . exr) . it &&& id . exr))))))) &&& curry (apply . (curry (abst . exr) . it &&& apply . (curry (apply . (curry (abst . exr) . it &&& apply . (apply . (curry (curry id . exr) . it &&& apply . (((id . exr) . exl) . id *** (id . exl) . id)) &&& apply . (((id . exr) . exl) . id *** (id . exr) . id)))) &&& apply . (curry (repr . exr) . it &&& apply . (curry (repr . exr) . it &&& id . exr))))))) &&& curry (apply . (curry (apply . (curry (abst . exr) . it &&& apply . (apply . (curry (curry (uncurry mul) . exr) . it &&& id . exr) &&& id . exr))) &&& apply . (curry (repr . exr) . it &&& id . exr))))) &&& curry (apply . (curry (apply . (curry (abst . exr) . it &&& apply . (apply . (curry (curry (uncurry add) . exr) . it &&& apply . (curry (repr . exr) . it &&& apply . (((id . exr) . exl) . id *** (id . exl) . id))) &&& apply . (curry (repr . exr) . it &&& apply . (((id . exr) . exl) . id *** (id . exr) . id))))) &&& apply . (curry (repr . exr) . it &&& apply . (curry (repr . exr) . it &&& id . exr)))))) &&& curry (apply . (curry (abst . exr) . it &&& apply . (curry (repr . exr) . it &&& id . exr))))) . (it &&& id) Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 22 / 57

slide-24
SLIDE 24

λpa, bq Ñ a ` b :: Int

In add 32 32 Out 32

module sum-2 (In_0, In_1, Out); input [0:31] In_0; input [0:31] In_1;

  • utput [0:31] Out;

wire [0:31] w_add_I1; assign w_add_I1 = In_0 + In_1; assign Out = w_add_I1; endmodule

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 23 / 57

slide-25
SLIDE 25

λpa, b, c, dq Ñ a ` b ` c ` d :: Int

In add 32 32 add 32 add 32 32 32 Out 32 Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 24 / 57

slide-26
SLIDE 26

λpa, b, c, dq Ñ pa ` bq ` pc ` dq :: Int

In add 32 32 add 32 32 add 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 25 / 57

slide-27
SLIDE 27

Uniform pairs

data Pair a “ a :# a Functor, Applicative, Monad, Foldable, Traversable (transpose).

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 26 / 57

slide-28
SLIDE 28

sum :: Pair Int Ñ Int

In add 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 27 / 57

slide-29
SLIDE 29

sumSquare :: Pair Int Ñ Int

In mul 32 32 mul 32 32 add 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 28 / 57

slide-30
SLIDE 30

Length-typed vectors

data Vec :: Nat Ñ ˚ Ñ ˚ where ZVec :: Vec0 a pŸq :: a Ñ Vecn a Ñ Vec1`n a

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 29 / 57

slide-31
SLIDE 31

Length-typed vectors

data Vec :: Nat Ñ ˚ Ñ ˚ where ZVec :: Vec0 a pŸq :: a Ñ Vecn a Ñ Vec1`n a instance Functor pVecnq where fmap ZVec “ ZVec fmap f pa Ÿ uq “ f a Ÿ fmap f u instance Foldable pVecnq where foldMap ZVec “ ε foldMap h pa Ÿ asq “ h a ‘ foldMap h as And Applicative, Monad, Traversable.

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 29 / 57

slide-32
SLIDE 32

fmap not :: Vec6 Bool Ñ Vec6 Bool

In not not not not not not Out

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 30 / 57

slide-33
SLIDE 33

sum :: Vec6 Int Ñ Int

In add 32 add 32 add 32 add 32 add 32 add 32 32 32 32 32 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 31 / 57

slide-34
SLIDE 34

Improved folding

Bypass ε when possible. instance Foldable pVecnq where foldMap ZVec “ ε foldMap h as@p Ÿ q “ foldMapS h as foldMapS :: Monoid m ñ pa Ñ mq Ñ Vec1`n a Ñ m foldMapS h pa Ÿ asq “ case as of ZVec Ñ h a p Ÿ q Ñ h a ‘ foldMapS h as

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 32 / 57

slide-35
SLIDE 35

sum :: Vec6 Int Ñ Int

In add 32 32 add 32 add 32 add 32 add 32 32 32 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 33 / 57

slide-36
SLIDE 36

Depth-typed trees

data Tree :: Nat Ñ ˚ Ñ ˚ where L :: a Ñ Tree0 a B :: Pair pTreen aq Ñ Tree1`n a

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 34 / 57

slide-37
SLIDE 37

Depth-typed trees

data Tree :: Nat Ñ ˚ Ñ ˚ where L :: a Ñ Tree0 a B :: Pair pTreen aq Ñ Tree1`n a instance Functor pTreenq where fmap f pL a q “ L pf aq fmap f pB tsq “ B ppfmap ˝ fmapq f tsq instance Foldable pTreenq where foldMap f pL a q “ f a foldMap f pB tsq “ pfoldMap ˝ foldMapq f ts And Applicative, Monad, Traversable. Easily generalize beyond Pair.

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 34 / 57

slide-38
SLIDE 38

fmap not :: Tree3 Bool Ñ Tree3 Bool

In not not not not not not not not Out

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 35 / 57

slide-39
SLIDE 39

sum :: Tree4 Int Ñ Int

In add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 add 32 add 32 32 add 32 add 32 32 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 36 / 57

slide-40
SLIDE 40

sum :: Tree3 Int Ñ Int

Monomorphized & simplified GHC Core:

let f0 :: Tree0 Int Ñ Sum Int f0 “ λds Ñ abst $fRepSum prepr $fRepTree0 dsq f1 :: Tree1 Int Ñ Sum Int f1 “ λds Ñ case repr $fRepPair prepr $fRepTree dsq of p, q a b Ñ abst $fRepSum p$fNumInt` prepr $fRepSum pf0 aqq prepr $fRepSum pf0 bqqq f2 :: Tree2 Int Ñ Sum Int f2 “ λds Ñ case repr $fRepPair prepr $fRepTree dsq of p, q a b Ñ abst $fRepSum p$fNumInt` prepr $fRepSum pf1 aqq prepr $fRepSum pf1 bqqq in λη Ñ repr $fRepSum pcase repr $fRepPair prepr $fRepTree ηq of p, q a b Ñ abst $fRepSum p$fNumInt` prepr $fRepSum pf2 aqq prepr $fRepSum pf2 bqqqq Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 37 / 57

slide-41
SLIDE 41

transpose :: Pair pTree4 Intq Ñ Tree4 pPair Intq

In Out 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 38 / 57

slide-42
SLIDE 42

transpose :: Tree4 pPair Intq Ñ Pair pTree4 Intq

In Out 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 39 / 57

slide-43
SLIDE 43

Dot products

dot :: pFoldable g, Foldable f , Num pf aq, Num aq ñ g pf aq Ñ a dot “ sum ˝ product Typically, g ” Pair.

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 40 / 57

slide-44
SLIDE 44

Dot products

dot :: pFoldable g, Foldable f , Num pf aq, Num aq ñ g pf aq Ñ a dot “ sum ˝ product Typically, g ” Pair. Alternatively, dot :: pTraversable g, Foldable f , Applicative f , Num aq ñ g pf aq Ñ a dot “ sum ˝ fmap product ˝ transpose where transpose :: pTraversable t, Applicative f q ñ t pf aq Ñ f pt aq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 40 / 57

slide-45
SLIDE 45

dot :: Pair pTree1 Intq Ñ Int

In mul 32 32 mul 32 32 add 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 41 / 57

slide-46
SLIDE 46

dot :: Pair pTree2 Intq Ñ Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 Out 32 Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 42 / 57

slide-47
SLIDE 47

dot :: Pair pTree3 Intq Ñ Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 43 / 57

slide-48
SLIDE 48

dot :: Pair pTree4 Intq Ñ Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 add 32 add 32 32 add 32 add 32 32 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 44 / 57

slide-49
SLIDE 49

dot :: Vec3 pTree2 Intq Ñ Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 mul 32 mul 32 mul 32 32 32 32 32 add 32 32 add 32 32 add 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 45 / 57

slide-50
SLIDE 50

dot :: Tree2 pTree2 Intq Ñ Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 mul 32 mul 32 mul 32 32 32 32 32 add 32 32 add 32 32 add 32 32 Out 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 46 / 57

slide-51
SLIDE 51

Linear transformations

p¨q :: pFoldable f , Num pf aq, Num aq ñ f a Ñ f a Ñ a u ¨ v “ dot pu :# vq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 47 / 57

slide-52
SLIDE 52

Linear transformations

p¨q :: pFoldable f , Num pf aq, Num aq ñ f a Ñ f a Ñ a u ¨ v “ dot pu :# vq type Matm,n a “ Vecn pVecm aq pˆ $q :: pIsNat m, Num aq ñ Matm,n a Ñ Vecm a Ñ Vecn a mat ˆ $ vec “ p¨vecq ă $ ą mat

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 47 / 57

slide-53
SLIDE 53

pˆ $q :: Mat2,3 Int Ñ Vec2 Int Ñ Vec3 Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 Out 32 add 32 32 32 add 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 48 / 57

slide-54
SLIDE 54

pˆ $q :: Mat4,2 Int Ñ Vec4 Int Ñ Vec2 Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 add 32 add 32 32 32 32 Out 32 add 32 add 32 add 32 32 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 49 / 57

slide-55
SLIDE 55

Generalizing linear transformations

pˆ $q :: pIsNat m, Num aq ñ Vecn pVecm aq Ñ Vecm a Ñ Vecn a mat ˆ $ vec “ p¨vecq ă $ ą mat More simply and generally, pˆ $q :: pFoldable m, Applicative m, Functor n, Num aq ñ n pm aq Ñ m a Ñ n a For instance, type MatT m,n a “ Treen pTreem aq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 50 / 57

slide-56
SLIDE 56

pˆ $q :: MatT 2,1 Int Ñ Tree2 Int Ñ Tree1 Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 Out 32 add 32 32 add 32 32 add 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 51 / 57

slide-57
SLIDE 57

pˆ $q :: MatT 2,2 Int Ñ Tree2 Int Ñ Tree2 Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 Out 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 52 / 57

slide-58
SLIDE 58

Composing linear transformations

Transform columns: pˆ ˝q :: pIsNat m, IsNat n, IsNat o, Num aq ñ Matn,o a Ñ Matm,n a Ñ Matm,o a no ˆ ˝ mn “ transpose ppno ˆ $q ă $ ą transpose mnq More simply and generally, pˆ ˝q :: pApplicative o, Traversable n, Applicative n , Traversable m, Applicative m, Num aq ñ

  • pn aq Ñ n pm aq Ñ o pm aq

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 53 / 57

slide-59
SLIDE 59

pˆ ˝q :: Mat3,4 Int Ñ Mat2,3 Int Ñ Mat2,4 Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 add 32 32 32 Out 32 add 32 add 32 32 32 32 add 32 add 32 32 32 32 add 32 add 32 32 32 32 add 32 add 32 32 32 32 add 32 add 32 32 32 32 add 32 add 32 32 32 32 add 32 add 32 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 54 / 57

slide-60
SLIDE 60

pˆ ˝q :: MatT 2,2 Int Ñ MatT 2,2 Int Ñ MatT 2,2 Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 Out 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32 add 32 32 add 32 32 add 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 55 / 57

slide-61
SLIDE 61

pˆ ˝q :: MatT 3,2 Int Ñ MatT 2,3 Int Ñ MatT 2,2 Int

In mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 mul 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 Out 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 32 add 32 add 32 32 32 32

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 56 / 57

slide-62
SLIDE 62

Status and future

GitHub repository Looking for collaboration and hiring recommendations To do:

Improve performance More examples Genuine sums for circuits Memory and computation management More interpretations (CCCs)

Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 57 / 57