diff --git a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bitwise-simplification.k b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bitwise-simplification.k index 0bf1c666b9..6b24c320cf 100644 --- a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bitwise-simplification.k +++ b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bitwise-simplification.k @@ -79,4 +79,29 @@ module BITWISE-SIMPLIFICATION [symbolic] rule 0 <=Int (X < true requires 0 <=Int X andBool 0 <=Int Y [simplification] + // ########################################################################### + // bit-xor + // ########################################################################### + + // Simplifications for the OpenZeppelin ternary operator function + + rule [xorInt-ge-zero]: + 0 <=Int X xorInt Y => true + requires 0 <=Int X andBool 0 <=Int Y + [simplification] + + rule [xorInt-lt]: + X xorInt Y true + requires X + ( ( notBool B ) andBool 0 #if B #then Y #else X #fi + [simplification] + endmodule diff --git a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bytes-simplification.k b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bytes-simplification.k index 00ad215864..1dddabea56 100644 --- a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bytes-simplification.k +++ b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/bytes-simplification.k @@ -34,6 +34,12 @@ module BYTES-SIMPLIFICATION [symbolic] rule [bytes-concat-right-assoc-symb-r]: (B1:Bytes +Bytes B2:Bytes) +Bytes B3:Bytes => B1 +Bytes (B2 +Bytes B3) [symbolic(B2), simplification(40)] rule [bytes-concat-left-assoc-conc]: B1:Bytes +Bytes (B2:Bytes +Bytes B3:Bytes) => (B1 +Bytes B2) +Bytes B3 [concrete(B1, B2), symbolic(B3), simplification(40)] + // Can ignore lower bytes for #asWord ( B1 ) b"" requires N ==Int 0 [simplification] diff --git a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/int-simplification.k b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/int-simplification.k index 265be3c071..89ebc352c6 100644 --- a/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/int-simplification.k +++ b/kevm-pyk/src/kevm_pyk/kproj/evm-semantics/lemmas/int-simplification.k @@ -96,6 +96,11 @@ module INT-SIMPLIFICATION-HASKELL [symbolic] rule { A +Int B #Equals C +Int B } => { A #Equals C } [simplification(40)] rule { A +Int B #Equals C +Int D } => { A -Int C #Equals D -Int B } [simplification(45), symbolic(A, C), concrete(B, D)] + rule 0 B B <=Int A [simplification, symbolic(A, B)] + rule 0 >Int A -Int B => B >Int A [simplification, symbolic(A, B)] + rule 0 >=Int A -Int B => B >=Int A [simplification, symbolic(A, B)] + endmodule module INT-SIMPLIFICATION-COMMON @@ -148,6 +153,24 @@ module INT-SIMPLIFICATION-COMMON rule (E *Int A) +Int B +Int C +Int D +Int (F *Int A) => ((E +Int F) *Int A) +Int B +Int C +Int D [simplification] + // Simplification of concrete multiplication + + rule A *Int B B B <=Int C /Int A + requires 0 C /Int A <=Int B + requires 0 C /Int A 0 + requires 0 <=Int A + andBool 0 false requires D false requires 0 <=Int A andBool B true requires 0 <=Int X andBool notBool (X ==Int 0) [simplification(60)] + + rule X <=Int maxUInt256 => X (notBool B) andBool A [simplification] + rule [notBool-or]: notBool ( A orBool B ) => ( notBool A ) andBool ( notBool B ) [simplification(60)] + rule [notBool-and]: notBool ( A andBool B ) => ( notBool A ) orBool ( notBool B ) [simplification(60)] + endmodule