Skip to content

Commit

Permalink
Merge pull request #1281 from GaloisInc/toSignedInteger
Browse files Browse the repository at this point in the history
Add `toSignedInteger` primitive.
  • Loading branch information
brianhuffman authored Sep 14, 2021
2 parents 5a668a4 + 869deb1 commit cb240cd
Show file tree
Hide file tree
Showing 16 changed files with 47 additions and 22 deletions.
2 changes: 1 addition & 1 deletion docs/ProgrammingCryptol/crashCourse/CrashCourse.tex
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,7 @@ \subsection{Appending and indexing}
[]
invalid sequence index: 12
-- Backtrace --
(Cryptol::@) called at Cryptol:870:14--870:20
(Cryptol::@) called at Cryptol:875:14--875:20
(Cryptol::@@) called at <interactive>:9:1--9:28
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
9
Expand Down
5 changes: 5 additions & 0 deletions lib/Cryptol.cry
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,11 @@ primitive (>>$) : {n, ix} (fin n, n >= 1, Integral ix) => [n] -> ix -> [n]
*/
primitive lg2 : {n} (fin n) => [n] -> [n]

/**
* Convert a signed 2's complement bitvector to an integer.
*/
primitive toSignedInteger : {n} (fin n, n >= 1) => [n] -> Integer


// Rational specific operations ----------------------------------------------

Expand Down
6 changes: 6 additions & 0 deletions src/Cryptol/Backend.hs
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,12 @@ class MonadIO (SEval sym) => Backend sym where
SWord sym ->
SEval sym (SInteger sym)

-- | Construct a signed integer value from the given packed word.
wordToSignedInt ::
sym ->
SWord sym ->
SEval sym (SInteger sym)

-- ==== Integer operations ====

-- | Addition of unbounded integers.
Expand Down
1 change: 1 addition & 0 deletions src/Cryptol/Backend/Concrete.hs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ instance Backend Concrete where
integerAsLit _ = Just

wordToInt _ (BV _ x) = pure x
wordToSignedInt _ (BV w x) = pure $! signedValue w x
wordFromInt _ w x = pure $! mkBv w x

packWord _ bits = pure $! BV (toInteger w) a
Expand Down
1 change: 1 addition & 0 deletions src/Cryptol/Backend/SBV.hs
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ instance Backend SBV where
wordLg2 _ a = sLg2 a

wordToInt _ x = pure $! svToInteger x
wordToSignedInt _ x = pure $! svToInteger (svSign x)
wordFromInt _ w i = pure $! svFromInteger w i

intEq _ a b = pure $! svEqual a b
Expand Down
1 change: 1 addition & 0 deletions src/Cryptol/Backend/What4.hs
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ instance W4.IsSymExprBuilder sym => Backend (What4 sym) where
liftIO (SW.bvSRem (w4 sym) x y)

wordToInt sym x = liftIO (SW.bvToInteger (w4 sym) x)
wordToSignedInt sym x = liftIO (SW.sbvToInteger (w4 sym) x)
wordFromInt sym width i = liftIO (SW.integerToBV (w4 sym) i width)

intPlus sym x y = liftIO $ W4.intAdd (w4 sym) x y
Expand Down
10 changes: 10 additions & 0 deletions src/Cryptol/Eval/Generic.hs
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,13 @@ smodV sym =
PWordFun \y ->
PPrim (VWord w . wordVal <$> wordSignedMod sym x y)

{-# SPECIALIZE toSignedIntegerV :: Concrete -> Prim Concrete #-}
toSignedIntegerV :: Backend sym => sym -> Prim sym
toSignedIntegerV sym =
PFinPoly \_w ->
PWordFun \x ->
PPrim (VInteger <$> wordToSignedInt sym x)

-- Cmp -------------------------------------------------------------------------

{-# SPECIALIZE cmpValue ::
Expand Down Expand Up @@ -2031,6 +2038,9 @@ genericPrimTable sym getEOpts =
unary (roundToEvenV sym))

-- Bitvector specific operations
, ("toSignedInteger"
, {-# SCC "Prelude::toSignedInteger" #-}
toSignedIntegerV sym)
, ("/$" , {-# SCC "Prelude::(/$)" #-}
sdivV sym)
, ("%$" , {-# SCC "Prelude::(%$)" #-}
Expand Down
8 changes: 4 additions & 4 deletions tests/issues/T146.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ Loading module Main

[error] at T146.cry:1:18--6:10:
The type ?a is not sufficiently polymorphic.
It cannot depend on quantified variables: fv`828
It cannot depend on quantified variables: fv`829
When checking type of field 'v0'
where
?a is type argument 'fv' of 'Main::ec_v1' at T146.cry:4:19--4:24
fv`828 is signature variable 'fv' at T146.cry:11:10--11:12
fv`829 is signature variable 'fv' at T146.cry:11:10--11:12
[error] at T146.cry:5:19--5:24:
The type ?b is not sufficiently polymorphic.
It cannot depend on quantified variables: fv`828
It cannot depend on quantified variables: fv`829
When checking signature variable 'fv'
where
?b is type argument 'fv' of 'Main::ec_v2' at T146.cry:5:19--5:24
fv`828 is signature variable 'fv' at T146.cry:11:10--11:12
fv`829 is signature variable 'fv' at T146.cry:11:10--11:12
12 changes: 6 additions & 6 deletions tests/issues/issue1024.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,20 @@ Loading module Main
Unused name: g

[error] at issue1024a.cry:1:6--1:11:
Illegal kind assigned to type variable: f`825
Illegal kind assigned to type variable: f`826
Unexpected: # -> *
where
f`825 is signature variable 'f' at issue1024a.cry:1:12--1:24
f`826 is signature variable 'f' at issue1024a.cry:1:12--1:24
[error] at issue1024a.cry:2:6--2:13:
Illegal kind assigned to type variable: f`826
Illegal kind assigned to type variable: f`827
Unexpected: Prop
where
f`826 is signature variable 'f' at issue1024a.cry:2:14--2:24
f`827 is signature variable 'f' at issue1024a.cry:2:14--2:24
[error] at issue1024a.cry:4:13--4:49:
Illegal kind assigned to type variable: f`828
Illegal kind assigned to type variable: f`829
Unexpected: # -> *
where
f`828 is signature variable 'f' at issue1024a.cry:4:22--4:32
f`829 is signature variable 'f' at issue1024a.cry:4:22--4:32
Loading module Cryptol
Loading module Main
0xffff
2 changes: 1 addition & 1 deletion tests/issues/issue103.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Loading module Cryptol

Run-time error: undefined
-- Backtrace --
Cryptol::error called at Cryptol:1040:13--1040:18
Cryptol::error called at Cryptol:1045:13--1045:18
Cryptol::undefined called at issue103.icry:1:9--1:18
Using exhaustive testing.
Testing... ERROR for the following inputs:
Expand Down
1 change: 1 addition & 0 deletions tests/issues/issue226.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ Symbols
tail : {n, a} [1 + n]a -> [n]a
take : {front, back, a} [front + back]a -> [front]a
toInteger : {a} (Integral a) => a -> Integer
toSignedInteger : {n} (fin n, n >= 1) => [n] -> Integer
trace : {n, a, b} (fin n) => String n -> a -> b -> b
traceVal : {n, a} (fin n) => String n -> a -> a
transpose : {rows, cols, a} [rows][cols]a -> [cols][rows]a
Expand Down
4 changes: 2 additions & 2 deletions tests/issues/issue290v2.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ Loading module Main

[error] at issue290v2.cry:2:1--2:19:
Unsolved constraints:
• n`825 == 1
• n`826 == 1
arising from
checking a pattern: type of 1st argument of Main::minMax
at issue290v2.cry:2:8--2:11
where
n`825 is signature variable 'n' at issue290v2.cry:1:11--1:12
n`826 is signature variable 'n' at issue290v2.cry:1:11--1:12
4 changes: 2 additions & 2 deletions tests/issues/issue723.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ Loading module Main
assuming
• fin k
the following constraints hold:
• k == n`825
• k == n`826
arising from
matching types
at issue723.cry:7:17--7:19
where
n`825 is signature variable 'n' at issue723.cry:1:6--1:7
n`826 is signature variable 'n' at issue723.cry:1:6--1:7
2 changes: 1 addition & 1 deletion tests/modsys/T16.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ Loading module T16::B

[error] at ./T16/B.cry:5:5--5:11
Multiple definitions for symbol: update
(at Cryptol:894:11--894:17, update)
(at Cryptol:899:11--899:17, update)
(at ./T16/A.cry:3:1--3:7, T16::A::update)
2 changes: 1 addition & 1 deletion tests/regression/safety.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Counterexample
(\x -> assert x "asdf" "asdf") False ~> ERROR
Run-time error: asdf
-- Backtrace --
Cryptol::error called at Cryptol:1048:41--1048:46
Cryptol::error called at Cryptol:1053:41--1053:46
Cryptol::assert called at safety.icry:3:14--3:20
<interactive>::it called at safety.icry:3:7--3:37
Counterexample
Expand Down
8 changes: 4 additions & 4 deletions tests/regression/tc-errors.icry.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -83,19 +83,19 @@ Loading module Main

[error] at tc-errors-5.cry:2:5--2:7:
Inferred type is not sufficiently polymorphic.
Quantified variable: a`825
Quantified variable: a`826
cannot match type: [0]?a
When checking the type of 'Main::f'
where
?a is type of sequence member at tc-errors-5.cry:2:5--2:7
a`825 is signature variable 'a' at tc-errors-5.cry:1:6--1:7
a`826 is signature variable 'a' at tc-errors-5.cry:1:6--1:7
Loading module Cryptol
Loading module Main

[error] at tc-errors-6.cry:4:7--4:8:
The type ?a is not sufficiently polymorphic.
It cannot depend on quantified variables: b`829
It cannot depend on quantified variables: b`830
When checking the type of 'g'
where
?a is the type of 'x' at tc-errors-6.cry:1:3--1:4
b`829 is signature variable 'b' at tc-errors-6.cry:3:8--3:9
b`830 is signature variable 'b' at tc-errors-6.cry:3:8--3:9

0 comments on commit cb240cd

Please sign in to comment.