Sign extend an arg to width n:
fun sex n nil = if n<=0 then nil else raise "cannot do sex on an empty list" | sex n [item] = if n<=1 then [item] else item :: sex (n-1) [item] | sex n (h::t) = h :: (sex (n-1) t);Example: integer constant:
| pandex w (Num n) = if n = 0 then [ xi_false ] else let fun k 0 = nil (* lsb first *) | k n = (if (n mod 2)=1 then xi_true else xi_false) :: k (n div 2) fun q 0 = [xi_true] (* final negative sign bit *) | q n = (if (n mod 2)=0 then xi_true else xi_false) :: q (n div 2) in if (n >= 0) then k n else sex w (q (0-1-n)) endExample: -4 in a 6 bit field is 111100. Example: conditional expression: a broadside multiplexor:
| pandex w (Query(g, t, f)) = let val t' = pandex w t val f' = pandex w f fun k([], []) = [] | k(a, nil) = k(a, [ false ]) | k(nil, b) = k([ false ], b) | k(a::at, b::bt) = gen_mux2(g, a, b) :: k(at, bt) in k(t', f') end
See other examples in the multipler/adder additional material.