@@ -4,41 +4,41 @@ import Parity
4import System
4import System
6data Bit : Nat -> Type where
6data Bit : Nat -> Type where
7− b0 : Bit Z
7+ B0 : Bit Z
8− b1 : Bit (S Z)
8+ B1 : Bit (S Z)
10instance Show (Bit n) where
10instance Show (Bit n) where
11 show = show' where
11 show = show' where
12 show' : Bit x -> String
12 show' : Bit x -> String
13− show' b0 = "0"
13+ show' B0 = "0"
14− show' b1 = "1"
14+ show' B1 = "1"
18data Binary : (width : Nat) -> (value : Nat) -> Type where
18data Binary : (width : Nat) -> (value : Nat) -> Type where
19− zero : Binary Z Z
19+ Zero : Binary Z Z
20 (#) : Binary w v -> Bit bit -> Binary (S w) (bit + 2 * v)
20 (#) : Binary w v -> Bit bit -> Binary (S w) (bit + 2 * v)
22instance Show (Binary w k) where
22instance Show (Binary w k) where
23− show zero = ""
23+ show Zero = ""
24 show (bin # bit) = show bin ++ show bit
24 show (bin # bit) = show bin ++ show bit
26pad : Binary w n -> Binary (S w) n
26pad : Binary w n -> Binary (S w) n
27−pad zero = zero # b0
27+pad Zero = Zero # B0
28pad (num # x) = pad num # x
28pad (num # x) = pad num # x
30natToBin : (width : Nat) -> (n : Nat) ->
30natToBin : (width : Nat) -> (n : Nat) ->
31 Maybe (Binary width n)
31 Maybe (Binary width n)
32natToBin Z (S k) = Nothing
32natToBin Z (S k) = Nothing
33−natToBin Z Z = Just zero
33+natToBin Z Z = Just Zero
34natToBin (S k) Z = do x <- natToBin k Z
34natToBin (S k) Z = do x <- natToBin k Z
35 Just (pad x)
35 Just (pad x)
36natToBin (S w) (S k) with (parity k)
36natToBin (S w) (S k) with (parity k)
37− natToBin (S w) (S (plus j j)) | even = do jbin <- natToBin w j
37+ natToBin (S w) (S (plus j j)) | Even = do jbin <- natToBin w j
38− let value = jbin # b1
38+ let value = jbin # B1
40− natToBin (S w) (S (S (plus j j))) | odd = do jbin <- natToBin w (S j)
40+ natToBin (S w) (S (S (plus j j))) | Odd = do jbin <- natToBin w (S j)
41− let value = jbin # b0
41+ let value = jbin # B0
44testBin : Maybe (Binary 8 42)
44testBin : Maybe (Binary 8 42)
@@ -49,17 +49,17 @@ term syntax bitpair [x] [y] = (_ ** (_ ** (x, y, Refl)))
50addBit : Bit x -> Bit y -> Bit c ->
50addBit : Bit x -> Bit y -> Bit c ->
51 (bX ** (bY ** (Bit bX, Bit bY, c + x + y = bY + 2 * bX)))
51 (bX ** (bY ** (Bit bX, Bit bY, c + x + y = bY + 2 * bX)))
52−addBit b0 b0 b0 = bitpair b0 b0
52+addBit B0 B0 B0 = bitpair B0 B0
53−addBit b0 b0 b1 = bitpair b0 b1
53+addBit B0 B0 B1 = bitpair B0 B1
54−addBit b0 b1 b0 = bitpair b0 b1
54+addBit B0 B1 B0 = bitpair B0 B1
55−addBit b0 b1 b1 = bitpair b1 b0
55+addBit B0 B1 B1 = bitpair B1 B0
56−addBit b1 b0 b0 = bitpair b0 b1
56+addBit B1 B0 B0 = bitpair B0 B1
57−addBit b1 b0 b1 = bitpair b1 b0
57+addBit B1 B0 B1 = bitpair B1 B0
58−addBit b1 b1 b0 = bitpair b1 b0
58+addBit B1 B1 B0 = bitpair B1 B0
59−addBit b1 b1 b1 = bitpair b1 b1
59+addBit B1 B1 B1 = bitpair B1 B1
61adc : Binary w x -> Binary w y -> Bit c -> Binary (S w) (c + x + y)
61adc : Binary w x -> Binary w y -> Bit c -> Binary (S w) (c + x + y)
62−adc zero zero carry ?= zero # carry
62+adc Zero Zero carry ?= Zero # carry
63adc (numx # bX) (numy # bY) carry
63adc (numx # bX) (numy # bY) carry
64 ?= let (bitpair carry0 lsb) = addBit bX bY carry in
64 ?= let (bitpair carry0 lsb) = addBit bX bY carry in
65 adc numx numy carry0 # lsb
65 adc numx numy carry0 # lsb
@@ -75,7 +75,7 @@ main = do let Just bin1 = natToBin 8 42
75 printLn bin1
75 printLn bin1
76 let Just bin2 = natToBin 8 89
76 let Just bin2 = natToBin 8 89
77 printLn bin2
77 printLn bin2
78− printLn (adc bin1 bin2 b0)
78+ printLn (adc bin1 bin2 B0)