From Haskell to Hardware via CCCs
Conal Elliott
Tabula
August, 2014
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 1 / 57
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.
Tabula
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 1 / 57
3D for shorter paths Implemented by rapid reconfiguration (2GHz) Minkowski spacetime (special relativity) Spacetime layout with causality constraints Very high sustained throughput
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 2 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 3 / 57
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
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;
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
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
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 8 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 9 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 10 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 11 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 12 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 13 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 14 / 57
❀ b
❀ bq
❀ bq
❀ bq ❀ cq
❀ bq ❀ pc ` ❀ dqq
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 15 / 57
❀ b
❀ bq ˆ❀ aq ❀ b
❀ cqq
❀ cqq Ñ pa ˆ❀ bq ❀ c Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 16 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 17 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 18 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 18 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 19 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 20 / 57
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
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
In add 32 32 Out 32
module sum-2 (In_0, In_1, Out); input [0:31] In_0; input [0:31] In_1;
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
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
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 26 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 27 / 57
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 29 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 29 / 57
In not not not not not not Out
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 30 / 57
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 32 / 57
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 34 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 34 / 57
In not not not not not not not not Out
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 35 / 57
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
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
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
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 40 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 40 / 57
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
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
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
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
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
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 47 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 47 / 57
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
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 50 / 57
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
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
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 53 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 54 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 55 / 57
Conal Elliott (Tabula) From Haskell to Hardware via CCCs August, 2014 56 / 57
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