def wv.gadd.go

bend-osdev-word64@0.1.1.0 · proof_value.bend:466

import bend-osdev-word64@0.1.1.0/proof_value.bend as ProofValue
import Base
import bend-osdev-u32@0.1.0.0/u32.bend as U
import bend-osdev-u32@0.1.0.0/LAWS.bend as UL

466# the value of the sum of two words of two halves, with its carry out
467def wv.gadd.go(+n: Nat, +ah: Word(n), +al: Word(n), +bh: Word(n), +bl: Word(n), eb: {Word.to_nat(n, wv.bitw(n, wv.c1add(n, al, bl))) == U.U32Nat.bit(wv.c1add(n, al, bl)) : Nat}) -> {Nat.add(Nat.add(Word.to_nat(n, Word.add(n, al, bl)), U.U32Nat.dbl(n, Word.to_nat(n, wv.addhi(n, ah, al, bh, bl)))), wv.Q(n, Nat.add(U.U32Nat.bit(Cmp.is_lt(Word.cmp(n, Word.add(n, ah, bh), ah))), U.U32Nat.bit(Cmp.is_lt(Word.cmp(n, wv.addhi(n, ah, al, bh, bl), Word.add(n, ah, bh))))))) == Nat.add(wv.V(n, ah, al), wv.V(n, bh, bl)) : Nat}:
468  +tw = Word.add(n, ah, bh)
469  +bw = wv.bitw(n, wv.c1add(n, al, bl))
470  wv.nadd(n, wv.c1add(n, al, bl), Cmp.is_lt(Word.cmp(n, tw, ah)), Cmp.is_lt(Word.cmp(n, wv.addhi(n, ah, al, bh, bl), tw)), Word.to_nat(n, Word.add(n, al, bl)), Word.to_nat(n, tw), Word.to_nat(n, wv.addhi(n, ah, al, bh, bl)), Word.to_nat(n, al), Word.to_nat(n, ah), Word.to_nat(n, bl), Word.to_nat(n, bh), Word.to_nat(n, bw), UL.word_add_wrap(n, al, bl), UL.word_add_wrap(n, ah, bh), UL.word_add_wrap(n, tw, bw), eb)

Uses (16)

Used by (1)