[YICES-HELP] Re: [YICES] Question about bitshift
Bruno Dutertre
bruno at csl.sri.com
Mon Feb 8 09:45:10 PST 2010
Sanjai Narain wrote:
> The following specification:
>
> (define-type vm (scalar host))
> (define-type vm_port (scalar e0))
> (define mask::(-> vm vm_port int))
> (assert (=(bv-shift-left0 0b11111111111111111111111111111111 (mask host
> e0)) 0b11111111111111111111111111111000))
> (check)
>
> run with "yices -e -tc spec.lisp" gives: Error: [spec.lisp, line(4),
> column(62), position(163)]: argument must be a number. It insists that
> the number of left shifts be fixed, not variable. I expect to get the
> solution (mask host e0) = 3. Any way around this? Thanks. -- Sanjai
>
Sanjai,
To do what you want, you can define a general bv-shift function,
using if-then-else(s):
(define bv-shift32::(-> (bitvector 32) nat (bitvector 32))
(lambda (u::(bitvector 32) n::nat)
(if (= n 0) u
(if (= n 1) (bv-shift-left0 u 1)
etc,
There is a significant cost of using such nested if-then-else,
but that should work.
Bruno
More information about the YICES-HELP
mailing list