Skip to main content

veryl_analyzer/
value.rs

1use crate::ir::{Shape, Type, TypeKind};
2use crate::{BigInt, BigUint, HashMap, Sign};
3use num_traits::{Num, One, ToPrimitive, Zero, one, zero};
4use std::borrow::Cow;
5use std::cell::LazyCell;
6use std::{fmt, str};
7use veryl_parser::veryl_grammar_trait as syntax_tree;
8
9/// Strip surrounding quotes and process escape sequences in a string literal.
10fn unescape_string_literal(s: &str) -> Vec<u8> {
11    let inner = if s.starts_with('"') && s.ends_with('"') && s.len() >= 2 {
12        &s[1..s.len() - 1]
13    } else {
14        s
15    };
16    let mut bytes = Vec::new();
17    let mut chars = inner.chars();
18    while let Some(c) = chars.next() {
19        if c == '\\' {
20            match chars.next() {
21                Some('n') => bytes.push(0x0a),
22                Some('t') => bytes.push(0x09),
23                Some('r') => bytes.push(0x0d),
24                Some('b') => bytes.push(0x08),
25                Some('f') => bytes.push(0x0c),
26                Some('\\') => bytes.push(b'\\'),
27                Some('"') => bytes.push(b'"'),
28                Some('/') => bytes.push(b'/'),
29                Some('u') => {
30                    let hex: String = chars.by_ref().take(4).collect();
31                    if hex.len() == 4
32                        && let Ok(code) = u32::from_str_radix(&hex, 16)
33                        && let Some(ch) = char::from_u32(code)
34                    {
35                        let mut buf = [0u8; 4];
36                        let encoded = ch.encode_utf8(&mut buf);
37                        bytes.extend_from_slice(encoded.as_bytes());
38                    } else {
39                        // Invalid \uXXXX sequence: preserve as-is
40                        bytes.extend_from_slice(b"\\u");
41                        bytes.extend_from_slice(hex.as_bytes());
42                    }
43                }
44                Some(other) => {
45                    bytes.push(b'\\');
46                    let mut buf = [0u8; 4];
47                    let encoded = other.encode_utf8(&mut buf);
48                    bytes.extend_from_slice(encoded.as_bytes());
49                }
50                None => bytes.push(b'\\'),
51            }
52        } else {
53            let mut buf = [0u8; 4];
54            let encoded = c.encode_utf8(&mut buf);
55            bytes.extend_from_slice(encoded.as_bytes());
56        }
57    }
58    bytes
59}
60
61/// Convert a string literal (with surrounding quotes) to a byte-packed Value.
62/// e.g. "abc" → payload=0x616263, width=24, signed=false
63pub fn string_to_byte_value(s: &str) -> Value {
64    let bytes = unescape_string_literal(s);
65    let width = bytes.len() * 8;
66    if width == 0 {
67        return Value::new(0, 0, false);
68    }
69    if bytes.len() <= 8 {
70        let mut payload: u64 = 0;
71        for &b in &bytes {
72            payload = (payload << 8) | (b as u64);
73        }
74        Value::new(payload, width, false)
75    } else {
76        let mut big = BigUint::zero();
77        for &b in &bytes {
78            big = (big << 8) | BigUint::from(b as u64);
79        }
80        Value::new_biguint(big, width, false)
81    }
82}
83
84/// Convert a byte-packed Value back to a String (inverse of string_to_byte_value).
85pub fn byte_value_to_string(value: &Value) -> Option<String> {
86    let width = value.width();
87    if width == 0 {
88        return Some(String::new());
89    }
90    if !width.is_multiple_of(8) {
91        return None;
92    }
93    let num_bytes = width / 8;
94    let mut bytes = vec![0u8; num_bytes];
95    match value {
96        Value::U64(v) => {
97            let mut payload = v.payload;
98            for i in (0..num_bytes).rev() {
99                bytes[i] = (payload & 0xff) as u8;
100                payload >>= 8;
101            }
102        }
103        Value::BigUint(v) => {
104            let mut big = v.payload().clone();
105            let mask = BigUint::from(0xffu64);
106            for i in (0..num_bytes).rev() {
107                bytes[i] = (&big & &mask).to_u64().unwrap_or(0) as u8;
108                big >>= 8;
109            }
110        }
111    }
112    String::from_utf8(bytes).ok()
113}
114
115/// Convert a BigUint to u128. Returns the low 128 bits.
116pub fn biguint_to_u128(v: &BigUint) -> u128 {
117    let digits = v.to_u64_digits();
118    match digits.len() {
119        0 => 0,
120        1 => digits[0] as u128,
121        _ => (digits[0] as u128) | ((digits[1] as u128) << 64),
122    }
123}
124
125/// Convert a u128 to BigUint.
126pub fn u128_to_biguint(v: u128) -> BigUint {
127    let lo = v as u64;
128    let hi = (v >> 64) as u64;
129    if hi == 0 {
130        BigUint::from(lo)
131    } else {
132        BigUint::from(lo) | (BigUint::from(hi) << 64)
133    }
134}
135
136/// Write a BigUint as little-endian bytes into `buf`, zero-filling unused bytes.
137pub fn biguint_to_le_bytes(v: &BigUint, buf: &mut [u8]) {
138    buf.fill(0);
139    let digits = v.to_u64_digits();
140    for (i, &d) in digits.iter().enumerate() {
141        let offset = i * 8;
142        if offset + 8 <= buf.len() {
143            buf[offset..offset + 8].copy_from_slice(&d.to_le_bytes());
144        }
145    }
146}
147
148/// Construct a BigUint from a little-endian byte buffer.
149pub fn biguint_from_le_bytes(buf: &[u8]) -> BigUint {
150    // Read u32 chunks for BigUint::from_slice (which expects native-endian u32s)
151    let n_u32 = buf.len() / 4;
152    let mut digits = Vec::with_capacity(n_u32);
153    for i in 0..n_u32 {
154        let offset = i * 4;
155        let d = u32::from_le_bytes([
156            buf[offset],
157            buf[offset + 1],
158            buf[offset + 2],
159            buf[offset + 3],
160        ]);
161        digits.push(d);
162    }
163    BigUint::from_slice(&digits)
164}
165
166// repr(C) is necessary for pointer access from Cranelift
167#[repr(C)]
168#[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
169pub struct ValueU64 {
170    pub payload: u64,
171    pub mask_xz: u64,
172    pub width: u32,
173    pub signed: bool,
174}
175
176impl ValueU64 {
177    pub fn new(payload: u64, width: usize, signed: bool) -> Self {
178        Self {
179            payload,
180            mask_xz: 0,
181            width: width as u32,
182            signed,
183        }
184    }
185
186    pub fn new_x(width: usize, signed: bool) -> Self {
187        let mask = Self::gen_mask(width);
188        Self {
189            payload: 0,
190            mask_xz: mask,
191            width: width as u32,
192            signed,
193        }
194    }
195
196    pub fn new_z(width: usize, signed: bool) -> Self {
197        let mask = Self::gen_mask(width);
198        Self {
199            payload: mask,
200            mask_xz: mask,
201            width: width as u32,
202            signed,
203        }
204    }
205
206    pub fn new_bit_1x(is_one: bool, is_x: bool) -> Self {
207        if is_one {
208            Self::new(1, 1, false)
209        } else if is_x {
210            Self::new_x(1, false)
211        } else {
212            Self::new(0, 1, false)
213        }
214    }
215
216    pub fn new_bit_0x(is_zero: bool, is_x: bool) -> Self {
217        if is_zero {
218            Self::new(0, 1, false)
219        } else if is_x {
220            Self::new_x(1, false)
221        } else {
222            Self::new(1, 1, false)
223        }
224    }
225
226    pub fn new_bit_x1(is_x: bool, is_one: bool) -> Self {
227        if is_x {
228            Self::new_x(1, false)
229        } else if is_one {
230            Self::new(1, 1, false)
231        } else {
232            Self::new(0, 1, false)
233        }
234    }
235
236    pub fn new_bit_x0(is_x: bool, is_zero: bool) -> Self {
237        if is_x {
238            Self::new_x(1, false)
239        } else if is_zero {
240            Self::new(0, 1, false)
241        } else {
242            Self::new(1, 1, false)
243        }
244    }
245
246    pub fn is_xz(&self) -> bool {
247        self.mask_xz != 0
248    }
249
250    pub fn gen_mask(width: usize) -> u64 {
251        if width >= 64 {
252            u64::MAX
253        } else {
254            (1u64 << width) - 1
255        }
256    }
257
258    pub fn gen_mask_range(beg: usize, end: usize) -> u64 {
259        let width = beg + 1;
260        let beg = Self::gen_mask(width);
261        let end = !Self::gen_mask(end);
262        beg & end
263    }
264
265    pub fn trunc(&mut self, width: usize) {
266        let mask = Self::gen_mask(width);
267        self.payload &= mask;
268        self.mask_xz &= mask;
269        self.width = width as u32;
270    }
271
272    pub fn select(&self, beg: usize, end: usize) -> Self {
273        if beg < end {
274            Self::default()
275        } else {
276            let width = beg - end + 1;
277            let mask = Self::gen_mask(width);
278            let mut ret = self.clone();
279
280            ret.payload >>= end;
281            ret.mask_xz >>= end;
282            ret.payload &= mask;
283            ret.mask_xz &= mask;
284            ret.width = width as u32;
285            ret.signed = false;
286
287            ret
288        }
289    }
290
291    pub fn assign(&mut self, mut value: Self, beg: usize, end: usize) {
292        value.payload <<= end;
293        value.mask_xz <<= end;
294
295        let mask = Self::gen_mask(self.width as usize);
296        let mask_range = Self::gen_mask_range(beg, end);
297        let inv_mask = mask ^ mask_range;
298
299        self.payload = (self.payload & inv_mask) | (value.payload & mask);
300        self.mask_xz = (self.mask_xz & inv_mask) | (value.mask_xz & mask);
301    }
302
303    pub fn to_usize(&self) -> Option<usize> {
304        if self.mask_xz != 0 {
305            None
306        } else {
307            self.payload.to_usize()
308        }
309    }
310
311    pub fn to_u32(&self) -> Option<u32> {
312        if self.mask_xz != 0 {
313            None
314        } else {
315            self.payload.to_u32()
316        }
317    }
318
319    pub fn to_u64(&self) -> Option<u64> {
320        if self.mask_xz != 0 {
321            None
322        } else {
323            Some(self.payload)
324        }
325    }
326
327    pub fn to_i64(&self) -> Option<i64> {
328        if self.mask_xz != 0 {
329            None
330        } else if self.signed {
331            let mask = Self::gen_mask(self.width as usize);
332            let msb = ((self.payload >> (self.width - 1)) & 1) == 1;
333            let ret = if msb {
334                self.payload | !mask
335            } else {
336                self.payload
337            };
338            Some(ret as i64)
339        } else {
340            self.payload.to_i64()
341        }
342    }
343
344    pub fn format_hex(&self) -> String {
345        gen_hex_string(self.payload, self.mask_xz, self.width)
346    }
347
348    pub fn format_bin(&self) -> String {
349        gen_bin_string(self.payload, self.mask_xz, self.width)
350    }
351
352    pub fn format_dec(&self) -> String {
353        if self.mask_xz != 0 {
354            "x".to_string()
355        } else if self.signed {
356            match self.to_i64() {
357                Some(v) => format!("{v}"),
358                None => "x".to_string(),
359            }
360        } else {
361            format!("{}", self.payload)
362        }
363    }
364
365    pub fn format_oct(&self) -> String {
366        gen_oct_string(self.payload, self.mask_xz, self.width)
367    }
368}
369
370fn gen_hex_string(payload: u64, mask_xz: u64, width: u32) -> String {
371    let len = width.div_ceil(4) as usize;
372
373    let first_full_bit_char = match width % 4 {
374        0 => 'f',
375        1 => '1',
376        2 => '3',
377        3 => '7',
378        _ => unreachable!(),
379    };
380
381    let mask_x = mask_xz & !payload;
382    let mask_z = mask_xz & payload;
383
384    let payload = format!("{:01$x}", payload, len);
385    let mask_x = format!("{:01$x}", mask_x, len);
386    let mask_z = format!("{:01$x}", mask_z, len);
387
388    let payload: Vec<_> = payload.chars().collect();
389    let mask_x: Vec<_> = mask_x.chars().collect();
390    let mask_z: Vec<_> = mask_z.chars().collect();
391
392    let mut ret = String::new();
393    for i in 0..len {
394        if mask_x[i] != '0' {
395            if mask_x[i] == 'f' || (i == 0 && mask_x[i] == first_full_bit_char) {
396                ret.push('x');
397            } else {
398                ret.push('X');
399            }
400        } else if mask_z[i] != '0' {
401            if mask_z[i] == 'f' || (i == 0 && mask_z[i] == first_full_bit_char) {
402                ret.push('z');
403            } else {
404                ret.push('Z');
405            }
406        } else {
407            ret.push(payload[i]);
408        }
409    }
410
411    ret
412}
413
414fn gen_bin_string(payload: u64, mask_xz: u64, width: u32) -> String {
415    let len = width as usize;
416
417    let mask_x = mask_xz & !payload;
418    let mask_z = mask_xz & payload;
419
420    let payload = format!("{:01$b}", payload, len);
421    let mask_x = format!("{:01$b}", mask_x, len);
422    let mask_z = format!("{:01$b}", mask_z, len);
423
424    let payload: Vec<_> = payload.chars().collect();
425    let mask_x: Vec<_> = mask_x.chars().collect();
426    let mask_z: Vec<_> = mask_z.chars().collect();
427
428    let mut ret = String::new();
429    for i in 0..len {
430        if mask_x[i] != '0' {
431            ret.push('x');
432        } else if mask_z[i] != '0' {
433            ret.push('z');
434        } else {
435            ret.push(payload[i]);
436        }
437    }
438
439    ret
440}
441
442fn gen_oct_string(payload: u64, mask_xz: u64, width: u32) -> String {
443    let len = width.div_ceil(3) as usize;
444
445    let first_full_bit_char = match width % 3 {
446        0 => '7',
447        1 => '1',
448        2 => '3',
449        _ => unreachable!(),
450    };
451
452    let mask_x = mask_xz & !payload;
453    let mask_z = mask_xz & payload;
454
455    let payload = format!("{:01$o}", payload, len);
456    let mask_x = format!("{:01$o}", mask_x, len);
457    let mask_z = format!("{:01$o}", mask_z, len);
458
459    let payload: Vec<_> = payload.chars().collect();
460    let mask_x: Vec<_> = mask_x.chars().collect();
461    let mask_z: Vec<_> = mask_z.chars().collect();
462
463    let mut ret = String::new();
464    for i in 0..len {
465        if mask_x[i] != '0' {
466            if mask_x[i] == '7' || (i == 0 && mask_x[i] == first_full_bit_char) {
467                ret.push('x');
468            } else {
469                ret.push('X');
470            }
471        } else if mask_z[i] != '0' {
472            if mask_z[i] == '7' || (i == 0 && mask_z[i] == first_full_bit_char) {
473                ret.push('z');
474            } else {
475                ret.push('Z');
476            }
477        } else {
478            ret.push(payload[i]);
479        }
480    }
481
482    ret
483}
484
485impl fmt::LowerHex for ValueU64 {
486    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
487        use std::fmt::Display;
488
489        let ret = if self.width == 0 {
490            if self.mask_xz == 0 {
491                if self.payload == 0 {
492                    "'0".to_string()
493                } else {
494                    "'1".to_string()
495                }
496            } else if self.payload == 0 {
497                "'x".to_string()
498            } else {
499                "'z".to_string()
500            }
501        } else {
502            let ret = gen_hex_string(self.payload, self.mask_xz, self.width);
503            let signed = if self.signed { "s" } else { "" };
504            format!("{}'{signed}h{ret}", self.width)
505        };
506
507        ret.fmt(f)
508    }
509}
510
511impl fmt::Binary for ValueU64 {
512    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
513        use std::fmt::Display;
514
515        let ret = if self.width == 0 {
516            if self.mask_xz == 0 {
517                if self.payload == 0 {
518                    "'0".to_string()
519                } else {
520                    "'1".to_string()
521                }
522            } else if self.payload == 0 {
523                "'x".to_string()
524            } else {
525                "'z".to_string()
526            }
527        } else {
528            let ret = gen_bin_string(self.payload, self.mask_xz, self.width);
529            let signed = if self.signed { "s" } else { "" };
530            format!("{}'{signed}b{ret}", self.width)
531        };
532
533        ret.fmt(f)
534    }
535}
536
537#[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
538pub struct ValueBigUint {
539    pub payload: Box<BigUint>,
540    pub mask_xz: Box<BigUint>,
541    pub width: u32,
542    pub signed: bool,
543}
544
545impl ValueBigUint {
546    pub fn new(payload: u64, width: usize, signed: bool) -> Self {
547        let payload = Box::new(BigUint::from(payload));
548        let mask_xz = Box::new(BigUint::zero());
549        Self {
550            payload,
551            mask_xz,
552            width: width as u32,
553            signed,
554        }
555    }
556
557    pub fn new_biguint(payload: BigUint, width: usize, signed: bool) -> Self {
558        let payload = Box::new(payload);
559        let mask_xz = Box::new(BigUint::zero());
560        Self {
561            payload,
562            mask_xz,
563            width: width as u32,
564            signed,
565        }
566    }
567
568    pub fn new_bigint(payload: BigInt, width: usize, signed: bool) -> Self {
569        let payload = if payload.sign() == Sign::Minus {
570            let val = payload.magnitude();
571            let mask = Self::gen_mask(width);
572            ((val ^ &mask) + BigUint::one()) & &mask
573        } else {
574            payload.magnitude().clone()
575        };
576
577        let payload = Box::new(payload);
578        let mask_xz = Box::new(BigUint::zero());
579        Self {
580            payload,
581            mask_xz,
582            width: width as u32,
583            signed,
584        }
585    }
586
587    pub fn new_x(width: usize, signed: bool) -> Self {
588        let payload = Box::new(BigUint::zero());
589        let mask_xz = Box::new(Self::gen_mask(width));
590        Self {
591            payload,
592            mask_xz,
593            width: width as u32,
594            signed,
595        }
596    }
597
598    pub fn new_z(width: usize, signed: bool) -> Self {
599        let payload = Box::new(Self::gen_mask(width));
600        let mask_xz = Box::new(Self::gen_mask(width));
601        Self {
602            payload,
603            mask_xz,
604            width: width as u32,
605            signed,
606        }
607    }
608
609    pub fn is_xz(&self) -> bool {
610        *self.mask_xz != BigUint::zero()
611    }
612
613    pub fn payload(&self) -> &BigUint {
614        self.payload.as_ref()
615    }
616
617    pub fn mask_xz(&self) -> &BigUint {
618        self.mask_xz.as_ref()
619    }
620
621    pub fn gen_mask(width: usize) -> BigUint {
622        let mut ret = Vec::new();
623        let mut remaining = width;
624        loop {
625            if remaining >= 32 {
626                ret.push(0xffffffff);
627                remaining -= 32;
628            } else {
629                ret.push((1u32 << remaining) - 1);
630                break;
631            }
632        }
633        BigUint::from_slice(&ret)
634    }
635
636    pub fn gen_mask_range(beg: usize, end: usize) -> BigUint {
637        let width = beg + 1;
638        let beg = Self::gen_mask(width);
639        let mut end = Self::gen_mask(end);
640        end ^= &beg;
641        beg & end
642    }
643
644    pub fn trunc(&mut self, width: usize) {
645        let mask = Self::gen_mask(width);
646        *self.payload &= &mask;
647        *self.mask_xz &= &mask;
648        self.width = width as u32;
649    }
650
651    pub fn select(&self, beg: usize, end: usize) -> Self {
652        if beg < end {
653            Self::default()
654        } else {
655            let width = beg - end + 1;
656            let mask = Self::gen_mask(width);
657            let mut ret = self.clone();
658
659            *ret.payload >>= end;
660            *ret.mask_xz >>= end;
661            *ret.payload &= &mask;
662            *ret.mask_xz &= &mask;
663            ret.width = width as u32;
664            ret.signed = false;
665
666            ret
667        }
668    }
669
670    pub fn assign(&mut self, mut value: Self, beg: usize, end: usize) {
671        *value.payload <<= end;
672        *value.mask_xz <<= end;
673
674        let mask = Self::gen_mask(self.width as usize);
675        let mask_range = Self::gen_mask_range(beg, end);
676        let inv_mask = &mask ^ &mask_range;
677
678        *self.payload = (self.payload() & &inv_mask) | (value.payload() & &mask);
679        *self.mask_xz = (self.mask_xz() & &inv_mask) | (value.mask_xz() & &mask);
680    }
681
682    pub fn to_usize(&self) -> Option<usize> {
683        if *self.mask_xz != BigUint::zero() {
684            None
685        } else {
686            self.payload.to_usize()
687        }
688    }
689
690    pub fn to_u32(&self) -> Option<u32> {
691        if *self.mask_xz != BigUint::zero() {
692            None
693        } else {
694            self.payload.to_u32()
695        }
696    }
697
698    pub fn to_bigint(&self) -> Option<BigInt> {
699        if *self.mask_xz != BigUint::zero() {
700            None
701        } else {
702            let msb = self.payload.bit((self.width - 1) as u64);
703            let sign = if msb { Sign::Minus } else { Sign::Plus };
704
705            if msb {
706                let mask = Self::gen_mask(self.width as usize);
707                let val = ((self.payload.as_ref() ^ &mask) + BigUint::one()) & &mask;
708                Some(BigInt::from_biguint(sign, val))
709            } else {
710                Some(BigInt::from_biguint(sign, self.payload.as_ref().clone()))
711            }
712        }
713    }
714
715    pub fn to_value_u64(&self) -> Option<ValueU64> {
716        if self.width <= 64 {
717            Some(ValueU64 {
718                payload: self.payload.to_u64().unwrap(),
719                mask_xz: self.mask_xz.to_u64().unwrap(),
720                width: self.width,
721                signed: self.signed,
722            })
723        } else {
724            None
725        }
726    }
727
728    /// Convert payload to u128, returning 0 if the value doesn't fit.
729    pub fn payload_u128(&self) -> u128 {
730        biguint_to_u128(&self.payload)
731    }
732
733    /// Convert mask_xz to u128, returning 0 if the value doesn't fit.
734    pub fn mask_xz_u128(&self) -> u128 {
735        biguint_to_u128(&self.mask_xz)
736    }
737
738    pub fn format_hex(&self) -> String {
739        let payload_digits = self.payload.to_u64_digits();
740        let mask_xz_digits = self.mask_xz.to_u64_digits();
741        let mut remaining = self.width;
742        let mut i = 0;
743        let mut ret = String::new();
744        while remaining != 0 {
745            let width = if remaining < 64 { remaining } else { 64 };
746            let p = payload_digits.get(i).unwrap_or(&0);
747            let m = mask_xz_digits.get(i).unwrap_or(&0);
748            ret = format!("{}{ret}", gen_hex_string(*p, *m, width));
749            remaining -= width;
750            i += 1;
751        }
752        ret
753    }
754
755    pub fn format_bin(&self) -> String {
756        let payload_digits = self.payload.to_u64_digits();
757        let mask_xz_digits = self.mask_xz.to_u64_digits();
758        let mut remaining = self.width;
759        let mut i = 0;
760        let mut ret = String::new();
761        while remaining != 0 {
762            let width = if remaining < 64 { remaining } else { 64 };
763            let p = payload_digits.get(i).unwrap_or(&0);
764            let m = mask_xz_digits.get(i).unwrap_or(&0);
765            ret = format!("{}{ret}", gen_bin_string(*p, *m, width));
766            remaining -= width;
767            i += 1;
768        }
769        ret
770    }
771
772    pub fn format_dec(&self) -> String {
773        if *self.mask_xz != BigUint::zero() {
774            "x".to_string()
775        } else if self.signed {
776            match self.to_bigint() {
777                Some(v) => format!("{v}"),
778                None => "x".to_string(),
779            }
780        } else {
781            format!("{}", self.payload)
782        }
783    }
784
785    pub fn format_oct(&self) -> String {
786        let payload_digits = self.payload.to_u64_digits();
787        let mask_xz_digits = self.mask_xz.to_u64_digits();
788        let mut remaining = self.width;
789        let mut i = 0;
790        let mut ret = String::new();
791        while remaining != 0 {
792            let width = if remaining < 64 { remaining } else { 64 };
793            let p = payload_digits.get(i).unwrap_or(&0);
794            let m = mask_xz_digits.get(i).unwrap_or(&0);
795            ret = format!("{}{ret}", gen_oct_string(*p, *m, width));
796            remaining -= width;
797            i += 1;
798        }
799        ret
800    }
801}
802
803impl fmt::LowerHex for ValueBigUint {
804    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
805        use std::fmt::Display;
806
807        let payload = self.payload.to_u64_digits();
808        let mask_xz = self.mask_xz.to_u64_digits();
809
810        let mut remaining = self.width;
811        let mut i = 0;
812        let mut ret = String::new();
813
814        while remaining != 0 {
815            let width = if remaining < 64 { remaining } else { 64 };
816            let payload = payload.get(i).unwrap_or(&0);
817            let mask_xz = mask_xz.get(i).unwrap_or(&0);
818            ret = format!("{}{ret}", gen_hex_string(*payload, *mask_xz, width));
819            remaining -= width;
820            i += 1;
821        }
822
823        let signed = if self.signed { "s" } else { "" };
824        format!("{}'{signed}h{ret}", self.width).fmt(f)
825    }
826}
827
828impl fmt::Binary for ValueBigUint {
829    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
830        use std::fmt::Display;
831
832        let payload = self.payload.to_u64_digits();
833        let mask_xz = self.mask_xz.to_u64_digits();
834
835        let mut remaining = self.width;
836        let mut i = 0;
837        let mut ret = String::new();
838
839        while remaining != 0 {
840            let width = if remaining < 64 { remaining } else { 64 };
841            let payload = payload.get(i).unwrap_or(&0);
842            let mask_xz = mask_xz.get(i).unwrap_or(&0);
843            ret = format!("{}{ret}", gen_bin_string(*payload, *mask_xz, width));
844            remaining -= width;
845            i += 1;
846        }
847
848        let signed = if self.signed { "s" } else { "" };
849        format!("{}'{signed}b{ret}", self.width).fmt(f)
850    }
851}
852
853#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
854pub enum Value {
855    U64(ValueU64),
856    BigUint(ValueBigUint),
857}
858
859impl Value {
860    pub fn new(payload: u64, width: usize, signed: bool) -> Self {
861        if width <= 64 {
862            Self::U64(ValueU64::new(payload, width, signed))
863        } else {
864            Self::BigUint(ValueBigUint::new(payload, width, signed))
865        }
866    }
867
868    pub fn new_biguint(payload: BigUint, width: usize, signed: bool) -> Self {
869        if width <= 64 {
870            Self::U64(ValueU64::new(payload.to_u64().unwrap(), width, signed))
871        } else {
872            Self::BigUint(ValueBigUint::new_biguint(payload, width, signed))
873        }
874    }
875
876    /// Construct a Value from u128 payload and mask_xz.
877    pub fn from_u128(payload: u128, mask_xz: u128, width: usize, signed: bool) -> Self {
878        if width <= 64 {
879            Self::U64(ValueU64 {
880                payload: payload as u64,
881                mask_xz: mask_xz as u64,
882                width: width as u32,
883                signed,
884            })
885        } else {
886            Self::BigUint(ValueBigUint {
887                payload: Box::new(u128_to_biguint(payload)),
888                mask_xz: Box::new(u128_to_biguint(mask_xz)),
889                width: width as u32,
890                signed,
891            })
892        }
893    }
894
895    pub fn new_x(width: usize, signed: bool) -> Self {
896        if width <= 64 {
897            Self::U64(ValueU64::new_x(width, signed))
898        } else {
899            Self::BigUint(ValueBigUint::new_x(width, signed))
900        }
901    }
902
903    pub fn new_z(width: usize, signed: bool) -> Self {
904        if width <= 64 {
905            Self::U64(ValueU64::new_z(width, signed))
906        } else {
907            Self::BigUint(ValueBigUint::new_z(width, signed))
908        }
909    }
910
911    #[inline(always)]
912    pub fn is_xz(&self) -> bool {
913        match self {
914            Self::U64(x) => x.is_xz(),
915            Self::BigUint(x) => x.is_xz(),
916        }
917    }
918
919    #[inline(always)]
920    pub fn payload(&self) -> Cow<'_, BigUint> {
921        match self {
922            Self::U64(x) => {
923                let ret = BigUint::from(x.payload);
924                Cow::Owned(ret)
925            }
926            Self::BigUint(x) => Cow::Borrowed(&x.payload),
927        }
928    }
929
930    #[inline(always)]
931    pub fn mask_xz(&self) -> Cow<'_, BigUint> {
932        match self {
933            Self::U64(x) => {
934                let ret = BigUint::from(x.mask_xz);
935                Cow::Owned(ret)
936            }
937            Self::BigUint(x) => Cow::Borrowed(&x.mask_xz),
938        }
939    }
940
941    pub fn select(&self, beg: usize, end: usize) -> Self {
942        match self {
943            Self::U64(x) => Self::U64(x.select(beg, end)),
944            Self::BigUint(x) => {
945                let ret = x.select(beg, end);
946                if let Some(x) = ret.to_value_u64() {
947                    Self::U64(x)
948                } else {
949                    Self::BigUint(ret)
950                }
951            }
952        }
953    }
954
955    pub fn trunc(&mut self, width: usize) {
956        let self_width = self.width();
957        if self_width == 0 {
958            let Self::U64(x) = self else {
959                unreachable!();
960            };
961
962            if width > 64 {
963                let payload = if x.payload != 0 {
964                    ValueBigUint::gen_mask(width)
965                } else {
966                    zero()
967                };
968                let mask_xz = if x.mask_xz != 0 {
969                    ValueBigUint::gen_mask(width)
970                } else {
971                    zero()
972                };
973                *self = Self::BigUint(ValueBigUint {
974                    payload: Box::new(payload),
975                    mask_xz: Box::new(mask_xz),
976                    width: width as u32,
977                    signed: false,
978                });
979            } else {
980                let payload = if x.payload != 0 {
981                    ValueU64::gen_mask(width)
982                } else {
983                    0
984                };
985                let mask_xz = if x.mask_xz != 0 {
986                    ValueU64::gen_mask(width)
987                } else {
988                    0
989                };
990                *self = Self::U64(ValueU64 {
991                    payload,
992                    mask_xz,
993                    width: width as u32,
994                    signed: false,
995                });
996            }
997        } else {
998            if self_width <= width {
999                return;
1000            }
1001
1002            match self {
1003                Self::U64(x) => x.trunc(width),
1004                Self::BigUint(x) => {
1005                    x.trunc(width);
1006
1007                    if let Some(y) = x.to_value_u64() {
1008                        *self = Self::U64(y);
1009                    }
1010                }
1011            }
1012        }
1013    }
1014
1015    pub fn concat(&self, x: &Value) -> Value {
1016        let width = self.width() + x.width();
1017
1018        if width > 64 {
1019            let (mut payload, mut mask_xz) = match self {
1020                Self::U64(x) => (BigUint::from(x.payload), BigUint::from(x.mask_xz)),
1021                Self::BigUint(x) => (x.payload().clone(), x.mask_xz().clone()),
1022            };
1023
1024            payload <<= x.width();
1025            mask_xz <<= x.width();
1026
1027            match x {
1028                Self::U64(x) => {
1029                    payload |= BigUint::from(x.payload);
1030                    mask_xz |= BigUint::from(x.mask_xz);
1031                }
1032                Self::BigUint(x) => {
1033                    payload |= x.payload();
1034                    mask_xz |= x.mask_xz();
1035                }
1036            }
1037
1038            Value::BigUint(ValueBigUint {
1039                payload: Box::new(payload),
1040                mask_xz: Box::new(mask_xz),
1041                width: width as u32,
1042                signed: false,
1043            })
1044        } else {
1045            let (mut payload, mut mask_xz) = if let Self::U64(x) = self {
1046                (x.payload, x.mask_xz)
1047            } else {
1048                unreachable!();
1049            };
1050
1051            let shift = x.width();
1052            if shift != 64 {
1053                payload <<= shift;
1054                mask_xz <<= shift;
1055            }
1056
1057            if let Self::U64(x) = x {
1058                payload |= x.payload;
1059                mask_xz |= x.mask_xz;
1060            } else {
1061                unreachable!();
1062            }
1063
1064            Value::U64(ValueU64 {
1065                payload,
1066                mask_xz,
1067                width: width as u32,
1068                signed: false,
1069            })
1070        }
1071    }
1072
1073    pub fn expand(&self, width: usize, use_sign: bool) -> Cow<'_, Self> {
1074        if self.width() >= width && self.width() != 0 {
1075            return Cow::Borrowed(self);
1076        }
1077
1078        // Materialize the unsized all_bit sentinel (width == 0) by
1079        // replicating its 1-bit pattern across the target width.
1080        if self.width() == 0 {
1081            let Self::U64(x) = self else {
1082                unreachable!();
1083            };
1084            if width > 64 {
1085                let payload = if x.payload != 0 {
1086                    ValueBigUint::gen_mask(width)
1087                } else {
1088                    zero()
1089                };
1090                let mask_xz = if x.mask_xz != 0 {
1091                    ValueBigUint::gen_mask(width)
1092                } else {
1093                    zero()
1094                };
1095                return Cow::Owned(Value::BigUint(ValueBigUint {
1096                    payload: Box::new(payload),
1097                    mask_xz: Box::new(mask_xz),
1098                    width: width as u32,
1099                    signed: false,
1100                }));
1101            } else {
1102                let payload = if x.payload != 0 {
1103                    ValueU64::gen_mask(width)
1104                } else {
1105                    0
1106                };
1107                let mask_xz = if x.mask_xz != 0 {
1108                    ValueU64::gen_mask(width)
1109                } else {
1110                    0
1111                };
1112                return Cow::Owned(Value::U64(ValueU64 {
1113                    payload,
1114                    mask_xz,
1115                    width: width as u32,
1116                    signed: false,
1117                }));
1118            }
1119        }
1120
1121        if width > 64 {
1122            let ret = match self {
1123                Self::U64(x) => {
1124                    let mut payload = Box::new(BigUint::from(x.payload));
1125                    let mut mask_xz = Box::new(BigUint::from(x.mask_xz));
1126
1127                    if x.signed && use_sign {
1128                        let msb = payload.bit((x.width - 1) as u64);
1129                        let msb_xz = mask_xz.bit((x.width - 1) as u64);
1130                        if msb | msb_xz {
1131                            let mask0 = ValueBigUint::gen_mask(width);
1132                            let mask1 = ValueBigUint::gen_mask(x.width as usize);
1133                            let mask = mask0 ^ mask1;
1134
1135                            if msb {
1136                                *payload |= &mask;
1137                            }
1138                            if msb_xz {
1139                                *mask_xz |= &mask;
1140                            }
1141                        }
1142                    }
1143
1144                    let signed = if use_sign { x.signed } else { false };
1145
1146                    ValueBigUint {
1147                        payload,
1148                        mask_xz,
1149                        width: width as u32,
1150                        signed,
1151                    }
1152                }
1153                Self::BigUint(x) => {
1154                    let mut ret = x.clone();
1155
1156                    if x.signed && use_sign {
1157                        let msb = ret.payload.bit((x.width - 1) as u64);
1158                        let msb_xz = ret.mask_xz.bit((x.width - 1) as u64);
1159                        if msb | msb_xz {
1160                            let mask0 = ValueBigUint::gen_mask(width);
1161                            let mask1 = ValueBigUint::gen_mask(x.width as usize);
1162                            let mask = mask0 ^ mask1;
1163
1164                            if msb {
1165                                *ret.payload |= &mask;
1166                            }
1167                            if msb_xz {
1168                                *ret.mask_xz |= &mask;
1169                            }
1170                        }
1171                    }
1172
1173                    if !use_sign {
1174                        ret.signed = false;
1175                    }
1176
1177                    ret.width = width as u32;
1178                    ret
1179                }
1180            };
1181            Cow::Owned(Value::BigUint(ret))
1182        } else if let Self::U64(x) = self {
1183            let mut payload = x.payload;
1184            let mut mask_xz = x.mask_xz;
1185
1186            if x.signed && use_sign {
1187                let msb = ((payload >> (x.width - 1)) & 1) == 1;
1188                let msb_xz = ((mask_xz >> (x.width - 1)) & 1) == 1;
1189                if msb | msb_xz {
1190                    let mask0 = ValueU64::gen_mask(width);
1191                    let mask1 = ValueU64::gen_mask(x.width as usize);
1192                    let mask = mask0 ^ mask1;
1193
1194                    if msb {
1195                        payload |= mask;
1196                    }
1197                    if msb_xz {
1198                        mask_xz |= mask;
1199                    }
1200                }
1201            }
1202
1203            let signed = if use_sign { x.signed } else { false };
1204
1205            Cow::Owned(Value::U64(ValueU64 {
1206                payload,
1207                mask_xz,
1208                width: width as u32,
1209                signed,
1210            }))
1211        } else {
1212            unreachable!();
1213        }
1214    }
1215
1216    pub fn assign(&mut self, value: Value, beg: usize, end: usize) {
1217        match self {
1218            Self::U64(x) => {
1219                let value = match value {
1220                    Value::U64(v) => v,
1221                    Value::BigUint(v) => ValueU64 {
1222                        payload: v.payload.to_u64().unwrap_or(0),
1223                        mask_xz: v.mask_xz.to_u64().unwrap_or(0),
1224                        width: v.width,
1225                        signed: v.signed,
1226                    },
1227                };
1228                x.assign(value, beg, end)
1229            }
1230            Self::BigUint(x) => {
1231                let value = match value {
1232                    Value::BigUint(v) => v,
1233                    Value::U64(v) => ValueBigUint {
1234                        payload: Box::new(BigUint::from(v.payload)),
1235                        mask_xz: Box::new(BigUint::from(v.mask_xz)),
1236                        width: v.width,
1237                        signed: v.signed,
1238                    },
1239                };
1240                x.assign(value, beg, end)
1241            }
1242        }
1243    }
1244
1245    pub fn set_value(&mut self, mut value: Value) {
1246        value.trunc(self.width());
1247        match self {
1248            Self::U64(x) => {
1249                let Value::U64(value) = value else {
1250                    unreachable!();
1251                };
1252                x.payload = value.payload;
1253                x.mask_xz = value.mask_xz;
1254            }
1255            Self::BigUint(x) => match value {
1256                Value::U64(value) => {
1257                    *x.payload = BigUint::from(value.payload);
1258                    *x.mask_xz = BigUint::from(value.mask_xz);
1259                }
1260                Value::BigUint(value) => {
1261                    x.payload = value.payload;
1262                    x.mask_xz = value.mask_xz;
1263                }
1264            },
1265        }
1266    }
1267
1268    #[inline(always)]
1269    pub fn clear_xz(&mut self) {
1270        match self {
1271            Self::U64(x) => {
1272                x.mask_xz = 0;
1273            }
1274            Self::BigUint(x) => {
1275                *x.mask_xz = 0u32.into();
1276            }
1277        }
1278    }
1279
1280    #[inline(always)]
1281    pub fn width(&self) -> usize {
1282        match self {
1283            Self::U64(x) => x.width as usize,
1284            Self::BigUint(x) => x.width as usize,
1285        }
1286    }
1287
1288    #[inline(always)]
1289    pub fn signed(&self) -> bool {
1290        match self {
1291            Self::U64(x) => x.signed,
1292            Self::BigUint(x) => x.signed,
1293        }
1294    }
1295
1296    #[inline(always)]
1297    pub fn set_signed(&mut self, signed: bool) {
1298        match self {
1299            Self::U64(x) => x.signed = signed,
1300            Self::BigUint(x) => x.signed = signed,
1301        }
1302    }
1303
1304    #[inline(always)]
1305    pub fn to_usize(&self) -> Option<usize> {
1306        match self {
1307            Self::U64(x) => x.to_usize(),
1308            Self::BigUint(_) => None,
1309        }
1310    }
1311
1312    #[inline(always)]
1313    pub fn to_u32(&self) -> Option<u32> {
1314        match self {
1315            Self::U64(x) => x.to_u32(),
1316            Self::BigUint(_) => None,
1317        }
1318    }
1319
1320    #[inline(always)]
1321    pub fn to_u64(&self) -> Option<u64> {
1322        match self {
1323            Self::U64(x) => x.to_u64(),
1324            Self::BigUint(_) => None,
1325        }
1326    }
1327
1328    pub fn format_hex(&self) -> String {
1329        match self {
1330            Self::U64(x) => x.format_hex(),
1331            Self::BigUint(x) => x.format_hex(),
1332        }
1333    }
1334
1335    pub fn format_bin(&self) -> String {
1336        match self {
1337            Self::U64(x) => x.format_bin(),
1338            Self::BigUint(x) => x.format_bin(),
1339        }
1340    }
1341
1342    pub fn format_dec(&self) -> String {
1343        match self {
1344            Self::U64(x) => x.format_dec(),
1345            Self::BigUint(x) => x.format_dec(),
1346        }
1347    }
1348
1349    pub fn format_oct(&self) -> String {
1350        match self {
1351            Self::U64(x) => x.format_oct(),
1352            Self::BigUint(x) => x.format_oct(),
1353        }
1354    }
1355
1356    pub fn payload_u64(&self) -> u64 {
1357        match self {
1358            Self::U64(x) => x.payload,
1359            Self::BigUint(x) => x.payload.to_u64().unwrap_or(0),
1360        }
1361    }
1362
1363    pub fn payload_u128(&self) -> u128 {
1364        match self {
1365            Self::U64(x) => x.payload as u128,
1366            Self::BigUint(x) => biguint_to_u128(&x.payload),
1367        }
1368    }
1369
1370    pub fn mask_xz_u128(&self) -> u128 {
1371        match self {
1372            Self::U64(x) => x.mask_xz as u128,
1373            Self::BigUint(x) => biguint_to_u128(&x.mask_xz),
1374        }
1375    }
1376
1377    /// Write payload to a little-endian byte buffer.
1378    /// `buf` must be at least `nb` bytes (8-byte aligned).
1379    pub fn write_payload_to_bytes(&self, buf: &mut [u8]) {
1380        biguint_to_le_bytes(&self.payload(), buf);
1381    }
1382
1383    /// Write mask_xz to a little-endian byte buffer.
1384    /// `buf` must be at least `nb` bytes (8-byte aligned).
1385    pub fn write_mask_xz_to_bytes(&self, buf: &mut [u8]) {
1386        biguint_to_le_bytes(&self.mask_xz(), buf);
1387    }
1388
1389    /// Construct a Value from little-endian byte buffers.
1390    pub fn from_le_bytes(payload: &[u8], mask_xz: &[u8], width: usize, signed: bool) -> Value {
1391        let p = biguint_from_le_bytes(payload);
1392        let m = biguint_from_le_bytes(mask_xz);
1393        if width <= 64 {
1394            Value::U64(ValueU64 {
1395                payload: p.to_u64().unwrap_or(0),
1396                mask_xz: m.to_u64().unwrap_or(0),
1397                width: width as u32,
1398                signed,
1399            })
1400        } else {
1401            Value::BigUint(ValueBigUint {
1402                payload: Box::new(p),
1403                mask_xz: Box::new(m),
1404                width: width as u32,
1405                signed,
1406            })
1407        }
1408    }
1409
1410    pub fn to_ir_type(&self) -> Type {
1411        let kind = if self.is_xz() {
1412            TypeKind::Logic
1413        } else {
1414            TypeKind::Bit
1415        };
1416        {
1417            let mut t = Type::new(kind);
1418            t.signed = self.signed();
1419            t.set_concrete_width(Shape::new(vec![Some(self.width())]));
1420            t
1421        }
1422    }
1423
1424    pub fn to_vcd_value(&self, i: u64) -> vcd::Value {
1425        if self.mask_xz().bit(i) {
1426            if self.payload().bit(i) {
1427                vcd::Value::Z
1428            } else {
1429                vcd::Value::X
1430            }
1431        } else if self.payload().bit(i) {
1432            vcd::Value::V1
1433        } else {
1434            vcd::Value::V0
1435        }
1436    }
1437
1438    /// Return MSB-first byte representation for FST signal changes.
1439    /// Each byte is an ASCII character: b'0', b'1', b'x', or b'z'.
1440    pub fn to_fst_bits(&self) -> Vec<u8> {
1441        let width = self.width() as u64;
1442        let mut bits = Vec::with_capacity(width as usize);
1443        for i in (0..width).rev() {
1444            bits.push(match self.to_vcd_value(i) {
1445                vcd::Value::V0 => b'0',
1446                vcd::Value::V1 => b'1',
1447                vcd::Value::X => b'x',
1448                vcd::Value::Z => b'z',
1449            });
1450        }
1451        bits
1452    }
1453
1454    pub fn as_u64_ptr(&mut self) -> Option<*mut ValueU64> {
1455        if let Value::U64(x) = self {
1456            Some(x)
1457        } else {
1458            None
1459        }
1460    }
1461
1462    pub fn is_positive(&self) -> bool {
1463        if self.is_xz() {
1464            return false;
1465        }
1466
1467        match self {
1468            Value::U64(x) => x.payload > 0,
1469            Value::BigUint(x) => !x.payload.is_zero(),
1470        }
1471    }
1472
1473    pub fn is_semantically_not_positive(&self) -> bool {
1474        if self.is_xz() {
1475            return false;
1476        }
1477
1478        match self {
1479            Value::U64(x) => x.signed && x.to_i64().is_some_and(|v| v <= 0),
1480            Value::BigUint(x) => x.signed && x.to_bigint().is_some_and(|v| v <= 0.into()),
1481        }
1482    }
1483}
1484
1485pub fn value_u64_offset() -> isize {
1486    let offset = LazyCell::new(|| {
1487        let x = Value::new(0, 64, false);
1488        let value_ptr = &x as *const Value as *const u8;
1489
1490        if let Value::U64(ref inner) = x {
1491            let u64_ptr = inner as *const ValueU64 as *const u8;
1492            unsafe { u64_ptr.offset_from(value_ptr) }
1493        } else {
1494            unreachable!()
1495        }
1496    });
1497    *offset
1498}
1499
1500impl fmt::LowerHex for Value {
1501    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1502        match self {
1503            Self::U64(x) => x.fmt(f),
1504            Self::BigUint(x) => x.fmt(f),
1505        }
1506    }
1507}
1508
1509impl fmt::Binary for Value {
1510    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1511        match self {
1512            Self::U64(x) => x.fmt(f),
1513            Self::BigUint(x) => x.fmt(f),
1514        }
1515    }
1516}
1517
1518fn from_based_str(s: &str) -> Value {
1519    let x = s.replace('_', "");
1520
1521    let (width, rest) = x.split_once('\'').unwrap();
1522    let signed = &rest[0..1] == "s";
1523    let rest = if signed { &rest[1..] } else { rest };
1524    let (base, value) = rest.split_at(1);
1525    let (radix, char_len, all1_char) = match base {
1526        "b" => (2, 1, '1'),
1527        "o" => (8, 3, '7'),
1528        "d" => (10, 0, '0'),
1529        "h" => (16, 4, 'f'),
1530        _ => unreachable!(),
1531    };
1532    let lexical_width = value.len() * char_len;
1533
1534    let payload = value.replace(['x', 'X', 'z', 'Z'], "0");
1535    let mask_x: String = value
1536        .chars()
1537        .map(|x| if x == 'x' || x == 'X' { all1_char } else { '0' })
1538        .collect();
1539    let mask_z: String = value
1540        .chars()
1541        .map(|x| if x == 'z' || x == 'Z' { all1_char } else { '0' })
1542        .collect();
1543
1544    let payload = BigUint::from_str_radix(&payload, radix).unwrap_or(BigUint::from(0u32));
1545    let mut mask_x = BigUint::from_str_radix(&mask_x, radix).unwrap_or(BigUint::from(0u32));
1546    let mut mask_z = BigUint::from_str_radix(&mask_z, radix).unwrap_or(BigUint::from(0u32));
1547
1548    let actual_width = payload.bits().max(mask_x.bits()).max(mask_z.bits()) as usize;
1549
1550    let width = if let Ok(x) = str::parse::<usize>(width) {
1551        if x > lexical_width && lexical_width != 0 {
1552            let mask_x_msb = mask_x.bit(lexical_width as u64 - 1);
1553            let mask_z_msb = mask_z.bit(lexical_width as u64 - 1);
1554
1555            if mask_x_msb {
1556                let mask = ValueBigUint::gen_mask(x);
1557                let inv_mask = ValueBigUint::gen_mask(lexical_width);
1558                let msb_expand = mask ^ inv_mask;
1559                mask_x |= msb_expand;
1560            }
1561            if mask_z_msb {
1562                let mask = ValueBigUint::gen_mask(x);
1563                let inv_mask = ValueBigUint::gen_mask(lexical_width);
1564                let msb_expand = mask ^ inv_mask;
1565                mask_z |= msb_expand;
1566            }
1567        }
1568        x
1569    } else {
1570        actual_width
1571    };
1572
1573    let mask_xz = &mask_x | &mask_z;
1574    let inv_mask = ValueBigUint::gen_mask(actual_width);
1575    let payload = (payload & (&mask_xz ^ inv_mask)) | mask_z;
1576
1577    let ret = ValueBigUint {
1578        payload: Box::new(payload),
1579        mask_xz: Box::new(mask_xz),
1580        width: width as u32,
1581        signed,
1582    };
1583
1584    if let Some(x) = ret.to_value_u64() {
1585        Value::U64(x)
1586    } else {
1587        Value::BigUint(ret)
1588    }
1589}
1590
1591fn from_base_less_str(s: &str) -> Value {
1592    let x = s.replace('_', "");
1593    let x = str::parse::<u64>(&x).unwrap();
1594    Value::new(x, 32, true)
1595}
1596
1597fn from_all_bit_str(s: &str) -> Value {
1598    let (width, rest) = s.split_once('\'').unwrap();
1599    let (payload, mask_xz, width) = if width.is_empty() {
1600        let width = 0;
1601        match rest {
1602            "0" => (zero(), zero(), width),
1603            "1" => (one(), zero(), width),
1604            "x" | "X" => (zero(), one(), width),
1605            "z" | "Z" => (one(), one(), width),
1606            _ => unreachable!(),
1607        }
1608    } else {
1609        let width = str::parse::<usize>(width).unwrap();
1610        let mask = ValueBigUint::gen_mask(width);
1611        match rest {
1612            "0" => (zero(), zero(), width),
1613            "1" => (mask, zero(), width),
1614            "x" | "X" => (zero(), mask, width),
1615            "z" | "Z" => (mask.clone(), mask, width),
1616            _ => unreachable!(),
1617        }
1618    };
1619
1620    let ret = ValueBigUint {
1621        payload: Box::new(payload),
1622        mask_xz: Box::new(mask_xz),
1623        width: width as u32,
1624        signed: false,
1625    };
1626
1627    if let Some(x) = ret.to_value_u64() {
1628        Value::U64(x)
1629    } else {
1630        Value::BigUint(ret)
1631    }
1632}
1633
1634fn from_fixed_point_str(s: &str) -> Value {
1635    if let Ok(x) = str::parse::<f64>(s) {
1636        Value::new(x.to_bits(), 64, false)
1637    } else {
1638        Value::new(0, 64, false)
1639    }
1640}
1641
1642fn from_exponent_str(s: &str) -> Value {
1643    if let Ok(x) = str::parse::<f64>(s) {
1644        Value::new(x.to_bits(), 64, false)
1645    } else {
1646        Value::new(0, 64, false)
1647    }
1648}
1649
1650impl str::FromStr for Value {
1651    type Err = ();
1652    fn from_str(s: &str) -> Result<Self, Self::Err> {
1653        let ret = if s.contains('\'') {
1654            let (_, rest) = s.split_once('\'').unwrap();
1655            if rest.starts_with(['s', 'b', 'o', 'd', 'h']) {
1656                from_based_str(s)
1657            } else {
1658                from_all_bit_str(s)
1659            }
1660        } else if s.contains('.') {
1661            from_fixed_point_str(s)
1662        } else {
1663            from_base_less_str(s)
1664        };
1665        Ok(ret)
1666    }
1667}
1668
1669impl From<&syntax_tree::Based> for Value {
1670    fn from(value: &syntax_tree::Based) -> Self {
1671        let text = value.based_token.to_string();
1672        from_based_str(&text)
1673    }
1674}
1675
1676impl From<&syntax_tree::BaseLess> for Value {
1677    fn from(value: &syntax_tree::BaseLess) -> Self {
1678        let text = value.base_less_token.to_string();
1679        from_base_less_str(&text)
1680    }
1681}
1682
1683impl From<&syntax_tree::AllBit> for Value {
1684    fn from(value: &syntax_tree::AllBit) -> Self {
1685        let text = value.all_bit_token.to_string();
1686        from_all_bit_str(&text)
1687    }
1688}
1689
1690impl From<&syntax_tree::FixedPoint> for Value {
1691    fn from(value: &syntax_tree::FixedPoint) -> Self {
1692        let text = value.fixed_point_token.to_string();
1693        from_fixed_point_str(&text)
1694    }
1695}
1696
1697impl From<&syntax_tree::Exponent> for Value {
1698    fn from(value: &syntax_tree::Exponent) -> Self {
1699        let text = value.exponent_token.to_string();
1700        from_exponent_str(&text)
1701    }
1702}
1703
1704impl From<&Value> for vcd::Value {
1705    fn from(value: &Value) -> Self {
1706        value.to_vcd_value(0)
1707    }
1708}
1709
1710impl IntoIterator for &Value {
1711    type Item = vcd::Value;
1712    type IntoIter = VcdValueIter;
1713    fn into_iter(self) -> Self::IntoIter {
1714        VcdValueIter {
1715            pos: 0,
1716            value: self.clone(),
1717        }
1718    }
1719}
1720
1721pub struct VcdValueIter {
1722    pos: u64,
1723    value: Value,
1724}
1725
1726impl Iterator for VcdValueIter {
1727    type Item = vcd::Value;
1728    fn next(&mut self) -> Option<Self::Item> {
1729        let width = self.value.width() as u64;
1730        if self.pos < width {
1731            let value = self.value.to_vcd_value(width - self.pos - 1);
1732            self.pos += 1;
1733            Some(value)
1734        } else {
1735            None
1736        }
1737    }
1738}
1739
1740/// Type for packed logic array defined by IEEE 1800-2023 H.10.1.2
1741#[repr(C)]
1742#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1743pub struct SvLogicVecVal {
1744    pub aval: u32,
1745    pub bval: u32,
1746}
1747
1748impl From<&[SvLogicVecVal]> for Value {
1749    fn from(value: &[SvLogicVecVal]) -> Self {
1750        let width = (value.len() * 32) as u32;
1751
1752        if width > 64 {
1753            let mut payload = BigUint::zero();
1754            let mut mask_xz = BigUint::zero();
1755
1756            for val in value.iter().rev() {
1757                payload <<= 32;
1758                mask_xz <<= 32;
1759                payload |= BigUint::from(val.aval ^ val.bval);
1760                mask_xz |= BigUint::from(val.bval);
1761            }
1762
1763            Value::BigUint(ValueBigUint {
1764                payload: Box::new(payload),
1765                mask_xz: Box::new(mask_xz),
1766                width,
1767                signed: false,
1768            })
1769        } else {
1770            let mut payload = 0u64;
1771            let mut mask_xz = 0u64;
1772
1773            for val in value.iter().rev() {
1774                payload <<= 32;
1775                mask_xz <<= 32;
1776                payload |= (val.aval ^ val.bval) as u64;
1777                mask_xz |= val.bval as u64;
1778            }
1779
1780            Value::U64(ValueU64 {
1781                payload,
1782                mask_xz,
1783                width,
1784                signed: false,
1785            })
1786        }
1787    }
1788}
1789
1790impl From<&Value> for Vec<SvLogicVecVal> {
1791    fn from(value: &Value) -> Self {
1792        let mut ret = vec![];
1793        let len = if value.width().is_multiple_of(32) {
1794            value.width() / 32
1795        } else {
1796            value.width() / 32 + 1
1797        };
1798
1799        match value {
1800            Value::U64(x) => {
1801                let mut payload = x.payload;
1802                let mut mask_xz = x.mask_xz;
1803
1804                for _ in 0..len {
1805                    let payload_u32 = (payload & 0xffffffff) as u32;
1806                    let mask_xz_u32 = (mask_xz & 0xffffffff) as u32;
1807                    let aval = payload_u32 ^ mask_xz_u32;
1808                    let bval = mask_xz_u32;
1809                    ret.push(SvLogicVecVal { aval, bval });
1810
1811                    payload >>= 32;
1812                    mask_xz >>= 32;
1813                }
1814            }
1815            Value::BigUint(x) => {
1816                let payload = x.payload.to_u32_digits();
1817                let mask_xz = x.mask_xz.to_u32_digits();
1818
1819                for i in 0..len {
1820                    let payload_u32 = *payload.get(i).unwrap_or(&0);
1821                    let mask_xz_u32 = *mask_xz.get(i).unwrap_or(&0);
1822                    let aval = payload_u32 ^ mask_xz_u32;
1823                    let bval = mask_xz_u32;
1824                    ret.push(SvLogicVecVal { aval, bval });
1825                }
1826            }
1827        }
1828
1829        ret
1830    }
1831}
1832
1833#[derive(Clone, Debug, Default)]
1834pub struct MaskCache {
1835    table: HashMap<usize, BigUint>,
1836}
1837
1838impl MaskCache {
1839    pub fn get(&mut self, width: usize) -> &BigUint {
1840        self.table
1841            .entry(width)
1842            .or_insert_with(|| ValueBigUint::gen_mask(width));
1843
1844        self.table.get(&width).unwrap()
1845    }
1846}
1847
1848#[cfg(test)]
1849mod tests {
1850    use super::*;
1851    use crate::ir::{Op, TypeKind};
1852    use std::str::FromStr;
1853
1854    #[test]
1855    fn select() {
1856        let x00 = Value::new(0x000, 10, false);
1857        let x01 = Value::new(0x01a, 10, false);
1858        let x02 = Value::new(0x3ff, 10, false);
1859
1860        let x00 = x00.select(1, 0);
1861        let x01 = x01.select(4, 1);
1862        let x02 = x02.select(9, 8);
1863
1864        assert_eq!(&format!("{:x}", x00), "2'h0");
1865        assert_eq!(&format!("{:x}", x01), "4'hd");
1866        assert_eq!(&format!("{:x}", x02), "2'h3");
1867
1868        let x10 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1869        let x11 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1870        let x12 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1871
1872        let x10 = x10.select(15, 2);
1873        let x11 = x11.select(31, 3);
1874        let x12 = x12.select(79, 8);
1875
1876        assert_eq!(&format!("{:x}", x10), "14'h3c3c");
1877        assert_eq!(&format!("{:x}", x11), "29'h00001e1e");
1878        assert_eq!(&format!("{:x}", x12), "72'hd0d00000e0e00000f0");
1879    }
1880
1881    #[test]
1882    fn trunc() {
1883        let mut x00 = Value::new(0x000, 10, false);
1884        let mut x01 = Value::new(0x01a, 10, false);
1885        let mut x02 = Value::new(0x3ff, 10, false);
1886
1887        x00.trunc(4);
1888        x01.trunc(5);
1889        x02.trunc(6);
1890
1891        assert_eq!(&format!("{:x}", x00), "4'h0");
1892        assert_eq!(&format!("{:x}", x01), "5'h1a");
1893        assert_eq!(&format!("{:x}", x02), "6'h3f");
1894
1895        let mut x10 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1896        let mut x11 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1897        let mut x12 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1898
1899        x10.trunc(16);
1900        x11.trunc(32);
1901        x12.trunc(72);
1902
1903        assert_eq!(&format!("{:x}", x10), "16'hf0f0");
1904        assert_eq!(&format!("{:x}", x11), "32'h0000f0f0");
1905        assert_eq!(&format!("{:x}", x12), "72'hd00000e0e00000f0f0");
1906    }
1907
1908    #[test]
1909    fn concat() {
1910        let x00 = Value::new(0x000, 10, false);
1911        let x01 = Value::new(0x01a, 10, false);
1912        let x02 = Value::new(0x3ff, 10, false);
1913
1914        let x00 = x00.concat(&x01);
1915        let x01 = x01.concat(&x02);
1916        let x02 = x02.concat(&x00);
1917
1918        assert_eq!(&format!("{:x}", x00), "20'h0001a");
1919        assert_eq!(&format!("{:x}", x01), "20'h06bff");
1920        assert_eq!(&format!("{:x}", x02), "30'h3ff0001a");
1921
1922        let x10 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1923        let x11 = Value::new_biguint(BigUint::from_slice(&[0xc0c0, 0xb0b0, 0xa0a0]), 80, false);
1924        let x12 = Value::new_biguint(BigUint::from_slice(&[0x9090, 0x8080, 0x7070]), 80, false);
1925
1926        let x10 = x10.concat(&x11);
1927        let x11 = x11.concat(&x12);
1928        let x12 = x12.concat(&x10);
1929
1930        assert_eq!(
1931            &format!("{:x}", x10),
1932            "160'hd0d00000e0e00000f0f0a0a00000b0b00000c0c0"
1933        );
1934        assert_eq!(
1935            &format!("{:x}", x11),
1936            "160'ha0a00000b0b00000c0c070700000808000009090"
1937        );
1938        assert_eq!(
1939            &format!("{:x}", x12),
1940            "240'h70700000808000009090d0d00000e0e00000f0f0a0a00000b0b00000c0c0"
1941        );
1942    }
1943
1944    #[test]
1945    fn value_format() {
1946        let x00 = Value::new(0x000, 10, false);
1947        let x01 = Value::new(0x01a, 10, false);
1948        let x02 = Value::new(0x3ff, 10, false);
1949
1950        assert_eq!(&format!("{:x}", x00), "10'h000");
1951        assert_eq!(&format!("{:x}", x01), "10'h01a");
1952        assert_eq!(&format!("{:x}", x02), "10'h3ff");
1953        assert_eq!(&format!("{:b}", x00), "10'b0000000000");
1954        assert_eq!(&format!("{:b}", x01), "10'b0000011010");
1955        assert_eq!(&format!("{:b}", x02), "10'b1111111111");
1956
1957        let x10 = Value::new(0x000, 80, false);
1958        let x11 = Value::new(0x01a, 80, false);
1959        let x12 = Value::new(0x3ff, 80, false);
1960        let x13 = Value::new_biguint(BigUint::from_slice(&[0xf0f0, 0xe0e0, 0xd0d0]), 80, false);
1961
1962        assert_eq!(&format!("{:x}", x10), "80'h00000000000000000000");
1963        assert_eq!(&format!("{:x}", x11), "80'h0000000000000000001a");
1964        assert_eq!(&format!("{:x}", x12), "80'h000000000000000003ff");
1965        assert_eq!(&format!("{:x}", x13), "80'hd0d00000e0e00000f0f0");
1966        assert_eq!(
1967            &format!("{:b}", x10),
1968            "80'b00000000000000000000000000000000000000000000000000000000000000000000000000000000"
1969        );
1970        assert_eq!(
1971            &format!("{:b}", x11),
1972            "80'b00000000000000000000000000000000000000000000000000000000000000000000000000011010"
1973        );
1974        assert_eq!(
1975            &format!("{:b}", x12),
1976            "80'b00000000000000000000000000000000000000000000000000000000000000000000001111111111"
1977        );
1978        assert_eq!(
1979            &format!("{:b}", x13),
1980            "80'b11010000110100000000000000000000111000001110000000000000000000001111000011110000"
1981        );
1982
1983        let x20 = Value::new_x(10, false);
1984        let x21 = Value::new_z(10, false);
1985        let x22 = Value::new_x(80, false);
1986        let x23 = Value::new_z(80, false);
1987
1988        assert_eq!(&format!("{:x}", x20), "10'hxxx");
1989        assert_eq!(&format!("{:x}", x21), "10'hzzz");
1990        assert_eq!(&format!("{:x}", x22), "80'hxxxxxxxxxxxxxxxxxxxx");
1991        assert_eq!(&format!("{:x}", x23), "80'hzzzzzzzzzzzzzzzzzzzz");
1992        assert_eq!(&format!("{:b}", x20), "10'bxxxxxxxxxx");
1993        assert_eq!(&format!("{:b}", x21), "10'bzzzzzzzzzz");
1994        assert_eq!(
1995            &format!("{:b}", x22),
1996            "80'bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
1997        );
1998        assert_eq!(
1999            &format!("{:b}", x23),
2000            "80'bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
2001        );
2002    }
2003
2004    #[test]
2005    fn xz_parse_format() {
2006        let x0 = Value::from_str("1'bx").unwrap();
2007        let x1 = Value::from_str("2'bx").unwrap();
2008        let x2 = Value::from_str("3'bx").unwrap();
2009        let x3 = Value::from_str("4'bx").unwrap();
2010        let x4 = Value::from_str("2'b0x").unwrap();
2011        let x5 = Value::from_str("3'b0x").unwrap();
2012        let x6 = Value::from_str("4'b0x").unwrap();
2013
2014        assert_eq!(&format!("{:x}", x0), "1'hx");
2015        assert_eq!(&format!("{:x}", x1), "2'hx");
2016        assert_eq!(&format!("{:x}", x2), "3'hx");
2017        assert_eq!(&format!("{:x}", x3), "4'hx");
2018        assert_eq!(&format!("{:x}", x4), "2'hX");
2019        assert_eq!(&format!("{:x}", x5), "3'hX");
2020        assert_eq!(&format!("{:x}", x6), "4'hX");
2021        assert_eq!(&format!("{:b}", x0), "1'bx");
2022        assert_eq!(&format!("{:b}", x1), "2'bxx");
2023        assert_eq!(&format!("{:b}", x2), "3'bxxx");
2024        assert_eq!(&format!("{:b}", x3), "4'bxxxx");
2025        assert_eq!(&format!("{:b}", x4), "2'b0x");
2026        assert_eq!(&format!("{:b}", x5), "3'b00x");
2027        assert_eq!(&format!("{:b}", x6), "4'b000x");
2028    }
2029
2030    #[test]
2031    fn parse() {
2032        let x00 = Value::from_str("10'b101").unwrap();
2033        let x01 = Value::from_str("10'o123").unwrap();
2034        let x02 = Value::from_str("10'd123").unwrap();
2035        let x03 = Value::from_str("10'h12f").unwrap();
2036        let x04 = Value::from_str("10'sb101").unwrap();
2037        let x05 = Value::from_str("10'so123").unwrap();
2038        let x06 = Value::from_str("10'sd123").unwrap();
2039        let x07 = Value::from_str("10'sh12f").unwrap();
2040        let x08 = Value::from_str("'0").unwrap();
2041        let x09 = Value::from_str("'1").unwrap();
2042        let x10 = Value::from_str("'x").unwrap();
2043        let x11 = Value::from_str("'z").unwrap();
2044        let x12 = Value::from_str("10'0").unwrap();
2045        let x13 = Value::from_str("10'1").unwrap();
2046        let x14 = Value::from_str("10'x").unwrap();
2047        let x15 = Value::from_str("10'z").unwrap();
2048        let x16 = Value::from_str("1").unwrap();
2049        let x17 = Value::from_str("10").unwrap();
2050        let x18 = Value::from_str("100").unwrap();
2051        let x19 = Value::from_str("1000").unwrap();
2052        let x20 = Value::from_str("1.0").unwrap();
2053        let x21 = Value::from_str("1.11").unwrap();
2054        let x22 = Value::from_str("1.0e10").unwrap();
2055        let x23 = Value::from_str("1.11e10").unwrap();
2056
2057        assert_eq!(&format!("{:x}", x00), "10'h005");
2058        assert_eq!(&format!("{:x}", x01), "10'h053");
2059        assert_eq!(&format!("{:x}", x02), "10'h07b");
2060        assert_eq!(&format!("{:x}", x03), "10'h12f");
2061        assert_eq!(&format!("{:x}", x04), "10'sh005");
2062        assert_eq!(&format!("{:x}", x05), "10'sh053");
2063        assert_eq!(&format!("{:x}", x06), "10'sh07b");
2064        assert_eq!(&format!("{:x}", x07), "10'sh12f");
2065        assert_eq!(&format!("{:x}", x08), "'0");
2066        assert_eq!(&format!("{:x}", x09), "'1");
2067        assert_eq!(&format!("{:x}", x10), "'x");
2068        assert_eq!(&format!("{:x}", x11), "'z");
2069        assert_eq!(&format!("{:x}", x12), "10'h000");
2070        assert_eq!(&format!("{:x}", x13), "10'h3ff");
2071        assert_eq!(&format!("{:x}", x14), "10'hxxx");
2072        assert_eq!(&format!("{:x}", x15), "10'hzzz");
2073        assert_eq!(&format!("{:x}", x16), "32'sh00000001");
2074        assert_eq!(&format!("{:x}", x17), "32'sh0000000a");
2075        assert_eq!(&format!("{:x}", x18), "32'sh00000064");
2076        assert_eq!(&format!("{:x}", x19), "32'sh000003e8");
2077        assert_eq!(&format!("{:x}", x20), "64'h3ff0000000000000");
2078        assert_eq!(&format!("{:x}", x21), "64'h3ff1c28f5c28f5c3");
2079        assert_eq!(&format!("{:x}", x22), "64'h4202a05f20000000");
2080        assert_eq!(&format!("{:x}", x23), "64'h4204ace478000000");
2081    }
2082
2083    #[test]
2084    fn test_mask() {
2085        assert_eq!(format!("{:x}", ValueU64::gen_mask(1)), "1");
2086        assert_eq!(format!("{:x}", ValueU64::gen_mask(2)), "3");
2087        assert_eq!(format!("{:x}", ValueU64::gen_mask(3)), "7");
2088        assert_eq!(format!("{:x}", ValueU64::gen_mask(10)), "3ff");
2089        assert_eq!(format!("{:x}", ValueU64::gen_mask(59)), "7ffffffffffffff");
2090        assert_eq!(
2091            format!("{:x}", ValueBigUint::gen_mask(90)),
2092            "3ffffffffffffffffffffff"
2093        );
2094    }
2095
2096    #[test]
2097    fn bit_expand() {
2098        // x = 8'h11 ; $display("%b", x); // 0000000000010001
2099        // x = 8'hf2 ; $display("%b", x); // 0000000011110010
2100        // x = 8'hx3 ; $display("%b", x); // 00000000xxxx0011
2101        // x = 8'hz4 ; $display("%b", x); // 00000000zzzz0100
2102        // x = 8'sh15; $display("%b", x); // 0000000000010101
2103        // x = 8'shf6; $display("%b", x); // 1111111111110110
2104        // x = 8'shx7; $display("%b", x); // xxxxxxxxxxxx0111
2105        // x = 8'shz8; $display("%b", x); // zzzzzzzzzzzz1000
2106
2107        let x00 = Value::from_str("8'h11").unwrap();
2108        let x01 = Value::from_str("8'hf2").unwrap();
2109        let x02 = Value::from_str("8'hx3").unwrap();
2110        let x03 = Value::from_str("8'hz4").unwrap();
2111        let x04 = Value::from_str("8'sh15").unwrap();
2112        let x05 = Value::from_str("8'shf6").unwrap();
2113        let x06 = Value::from_str("8'shx7").unwrap();
2114        let x07 = Value::from_str("8'shz8").unwrap();
2115        let x00 = x00.expand(16, true);
2116        let x01 = x01.expand(16, true);
2117        let x02 = x02.expand(16, true);
2118        let x03 = x03.expand(16, true);
2119        let x04 = x04.expand(16, true);
2120        let x05 = x05.expand(16, true);
2121        let x06 = x06.expand(16, true);
2122        let x07 = x07.expand(16, true);
2123        assert_eq!(format!("{:b}", x00.as_ref()), "16'b0000000000010001");
2124        assert_eq!(format!("{:b}", x01.as_ref()), "16'b0000000011110010");
2125        assert_eq!(format!("{:b}", x02.as_ref()), "16'b00000000xxxx0011");
2126        assert_eq!(format!("{:b}", x03.as_ref()), "16'b00000000zzzz0100");
2127        assert_eq!(format!("{:b}", x04.as_ref()), "16'sb0000000000010101");
2128        assert_eq!(format!("{:b}", x05.as_ref()), "16'sb1111111111110110");
2129        assert_eq!(format!("{:b}", x06.as_ref()), "16'sbxxxxxxxxxxxx0111");
2130        assert_eq!(format!("{:b}", x07.as_ref()), "16'sbzzzzzzzzzzzz1000");
2131
2132        let x00 = Value::from_str("8'h11").unwrap();
2133        let x01 = Value::from_str("8'hf2").unwrap();
2134        let x02 = Value::from_str("8'hx3").unwrap();
2135        let x03 = Value::from_str("8'hz4").unwrap();
2136        let x04 = Value::from_str("8'sh15").unwrap();
2137        let x05 = Value::from_str("8'shf6").unwrap();
2138        let x06 = Value::from_str("8'shx7").unwrap();
2139        let x07 = Value::from_str("8'shz8").unwrap();
2140        let x00 = x00.expand(68, true);
2141        let x01 = x01.expand(68, true);
2142        let x02 = x02.expand(68, true);
2143        let x03 = x03.expand(68, true);
2144        let x04 = x04.expand(68, true);
2145        let x05 = x05.expand(68, true);
2146        let x06 = x06.expand(68, true);
2147        let x07 = x07.expand(68, true);
2148        assert_eq!(format!("{:x}", x00.as_ref()), "68'h00000000000000011");
2149        assert_eq!(format!("{:x}", x01.as_ref()), "68'h000000000000000f2");
2150        assert_eq!(format!("{:x}", x02.as_ref()), "68'h000000000000000x3");
2151        assert_eq!(format!("{:x}", x03.as_ref()), "68'h000000000000000z4");
2152        assert_eq!(format!("{:x}", x04.as_ref()), "68'sh00000000000000015");
2153        assert_eq!(format!("{:x}", x05.as_ref()), "68'shffffffffffffffff6");
2154        assert_eq!(format!("{:x}", x06.as_ref()), "68'shxxxxxxxxxxxxxxxx7");
2155        assert_eq!(format!("{:x}", x07.as_ref()), "68'shzzzzzzzzzzzzzzzz8");
2156    }
2157
2158    #[test]
2159    fn all_bit_expand() {
2160        // Unsized all_bit literals (width=0) must be materialized by
2161        // replicating the 1-bit pattern across the target width, including
2162        // widths <= 64.
2163        let all0 = Value::from_str("'0").unwrap();
2164        let all1 = Value::from_str("'1").unwrap();
2165        let allx = Value::from_str("'x").unwrap();
2166        let allz = Value::from_str("'z").unwrap();
2167
2168        assert_eq!(format!("{:b}", all0.expand(2, false).as_ref()), "2'b00");
2169        assert_eq!(format!("{:b}", all1.expand(2, false).as_ref()), "2'b11");
2170        assert_eq!(format!("{:b}", allx.expand(2, false).as_ref()), "2'bxx");
2171        assert_eq!(format!("{:b}", allz.expand(2, false).as_ref()), "2'bzz");
2172
2173        assert_eq!(
2174            format!("{:x}", all0.expand(64, false).as_ref()),
2175            "64'h0000000000000000"
2176        );
2177        assert_eq!(
2178            format!("{:x}", all1.expand(64, false).as_ref()),
2179            "64'hffffffffffffffff"
2180        );
2181
2182        assert_eq!(
2183            format!("{:x}", all0.expand(128, false).as_ref()),
2184            "128'h00000000000000000000000000000000"
2185        );
2186        assert_eq!(
2187            format!("{:x}", all1.expand(128, false).as_ref()),
2188            "128'hffffffffffffffffffffffffffffffff"
2189        );
2190
2191        // `x == '1` must compare against the width-filled pattern, not 1.
2192        let two_b11 = Value::from_str("2'b11").unwrap();
2193        let two_b01 = Value::from_str("2'b01").unwrap();
2194        let mut cache = MaskCache::default();
2195        let eq_op = Op::Eq;
2196        let r0 = eq_op.eval_value_binary(&two_b11, &all1, 1, false, &mut cache);
2197        let r1 = eq_op.eval_value_binary(&two_b01, &all1, 1, false, &mut cache);
2198        assert_eq!(format!("{:b}", r0), "1'b1");
2199        assert_eq!(format!("{:b}", r1), "1'b0");
2200    }
2201
2202    #[test]
2203    fn assign_into_all_x_biguint() {
2204        // Writing a 2-state bit (mask_xz=0) via `assign` into a single
2205        // position of a 4-state BigUint must clear mask_xz at that bit
2206        // even when the incoming value is a U64 (triggering variant
2207        // conversion).
2208        use num_bigint::BigUint;
2209
2210        let all_ones: BigUint = (BigUint::from(1u8) << 128u32) - BigUint::from(1u8);
2211        let mut reversed = Value::BigUint(ValueBigUint {
2212            payload: Box::new(BigUint::from(0u64)),
2213            mask_xz: Box::new(all_ones.clone()),
2214            width: 128,
2215            signed: false,
2216        });
2217
2218        for i in 0usize..128 {
2219            let j = 127 - i;
2220            let bit = if j == 127 { 1u64 } else { 0u64 };
2221            let v = Value::new(bit, 1, false);
2222            reversed.assign(v, i, i);
2223        }
2224
2225        match reversed {
2226            Value::BigUint(r) => {
2227                assert_eq!(*r.payload, BigUint::from(1u64));
2228                assert_eq!(*r.mask_xz, BigUint::from(0u64));
2229            }
2230            Value::U64(_) => panic!("expected BigUint"),
2231        }
2232    }
2233
2234    #[test]
2235    fn assign_mixed_u64_biguint() {
2236        // Assigning a narrow U64 into a BigUint target (and vice versa)
2237        // must succeed instead of hitting `unreachable!()` — this is what
2238        // `bits[i] = '1` on a logic<128> does.
2239        let mut target = Value::new(0, 128, false);
2240        let one_bit = Value::new(1, 1, false);
2241        target.assign(one_bit, 127, 127);
2242        assert_eq!(
2243            format!("{:x}", target),
2244            "128'h80000000000000000000000000000000"
2245        );
2246
2247        let mut target = Value::new(0, 128, false);
2248        let one_bit = Value::new(1, 1, false);
2249        target.assign(one_bit, 63, 63);
2250        assert_eq!(
2251            format!("{:x}", target),
2252            "128'h00000000000000008000000000000000"
2253        );
2254
2255        let mut target = Value::new(0, 128, false);
2256        let nibble = Value::new(0xf, 4, false);
2257        target.assign(nibble, 67, 64);
2258        assert_eq!(
2259            format!("{:x}", target),
2260            "128'h000000000000000f0000000000000000"
2261        );
2262    }
2263
2264    #[test]
2265    fn signed_unsigned() {
2266        //x = 8'shf2 + 8'hf2           ; $display("%b", x); // 0000000111100100
2267        //x = (8'shf2 + 8'shf2) + 8'hf2; $display("%b", x); // 0000001011010110
2268
2269        let op = Op::Add;
2270        let mut cache = MaskCache::default();
2271
2272        let x00 = Value::from_str("8'shf2").unwrap();
2273        let x01 = Value::from_str("8'hf2").unwrap();
2274        let x10 = op.eval_value_binary(&x00, &x01, 16, false, &mut cache);
2275        let x11 = op.eval_value_binary(
2276            &op.eval_value_binary(&x00, &x00, 16, false, &mut cache),
2277            &x01,
2278            16,
2279            false,
2280            &mut cache,
2281        );
2282        assert_eq!(format!("{:b}", x10), "16'b0000000111100100");
2283        assert_eq!(format!("{:b}", x11), "16'b0000001011010110");
2284    }
2285
2286    #[test]
2287    fn sv_logic_vec_val() {
2288        let x00 = Value::from_str("8'h11").unwrap();
2289        let x01 = Value::from_str("8'hf2").unwrap();
2290        let x02 = Value::from_str("8'hx3").unwrap();
2291        let x03 = Value::from_str("8'hz4").unwrap();
2292        let x04 = Value::from_str("68'h11").unwrap();
2293        let x05 = Value::from_str("68'hf2").unwrap();
2294        let x06 = Value::from_str("68'hx3").unwrap();
2295        let x07 = Value::from_str("68'hz4").unwrap();
2296
2297        let x00: Vec<SvLogicVecVal> = (&x00).into();
2298        let x01: Vec<SvLogicVecVal> = (&x01).into();
2299        let x02: Vec<SvLogicVecVal> = (&x02).into();
2300        let x03: Vec<SvLogicVecVal> = (&x03).into();
2301        let x04: Vec<SvLogicVecVal> = (&x04).into();
2302        let x05: Vec<SvLogicVecVal> = (&x05).into();
2303        let x06: Vec<SvLogicVecVal> = (&x06).into();
2304        let x07: Vec<SvLogicVecVal> = (&x07).into();
2305
2306        assert_eq!(x00[0].aval, 0x11);
2307        assert_eq!(x00[0].bval, 0);
2308        assert_eq!(x01[0].aval, 0xf2);
2309        assert_eq!(x01[0].bval, 0);
2310        assert_eq!(x02[0].aval, 0xf3);
2311        assert_eq!(x02[0].bval, 0xf0);
2312        assert_eq!(x03[0].aval, 0x4);
2313        assert_eq!(x03[0].bval, 0xf0);
2314        assert_eq!(x04[0].aval, 0x11);
2315        assert_eq!(x04[0].bval, 0);
2316        assert_eq!(x04[1].aval, 0);
2317        assert_eq!(x04[1].bval, 0);
2318        assert_eq!(x05[0].aval, 0xf2);
2319        assert_eq!(x05[0].bval, 0);
2320        assert_eq!(x05[1].aval, 0);
2321        assert_eq!(x05[1].bval, 0);
2322        assert_eq!(x06[0].aval, 0xfffffff3);
2323        assert_eq!(x06[0].bval, 0xfffffff0);
2324        assert_eq!(x06[1].aval, 0xffffffff);
2325        assert_eq!(x06[1].bval, 0xffffffff);
2326        assert_eq!(x07[0].aval, 0x4);
2327        assert_eq!(x07[0].bval, 0xfffffff0);
2328        assert_eq!(x07[1].aval, 0);
2329        assert_eq!(x07[1].bval, 0xffffffff);
2330
2331        let x00: Value = x00.as_slice().into();
2332        let x01: Value = x01.as_slice().into();
2333        let x02: Value = x02.as_slice().into();
2334        let x03: Value = x03.as_slice().into();
2335        let x04: Value = x04.as_slice().into();
2336        let x05: Value = x05.as_slice().into();
2337        let x06: Value = x06.as_slice().into();
2338        let x07: Value = x07.as_slice().into();
2339
2340        assert_eq!(format!("{:x}", x00), "32'h00000011");
2341        assert_eq!(format!("{:x}", x01), "32'h000000f2");
2342        assert_eq!(format!("{:x}", x02), "32'h000000x3");
2343        assert_eq!(format!("{:x}", x03), "32'h000000z4");
2344        assert_eq!(format!("{:x}", x04), "96'h000000000000000000000011");
2345        assert_eq!(format!("{:x}", x05), "96'h0000000000000000000000f2");
2346        assert_eq!(format!("{:x}", x06), "96'h0000000xxxxxxxxxxxxxxxx3");
2347        assert_eq!(format!("{:x}", x07), "96'h0000000zzzzzzzzzzzzzzzz4");
2348    }
2349
2350    #[test]
2351    fn unary_add() {
2352        //x = +8'h11 ; $display("%b", x); // 0000000000010001
2353        //x = +8'hf2 ; $display("%b", x); // 0000000011110010
2354        //x = +8'hx3 ; $display("%b", x); // 00000000xxxx0011
2355        //x = +8'hz4 ; $display("%b", x); // 00000000zzzz0100
2356        //x = +8'sh15; $display("%b", x); // 0000000000010101
2357        //x = +8'shf6; $display("%b", x); // 1111111111110110
2358        //x = +8'shx7; $display("%b", x); // xxxxxxxxxxxx0111
2359        //x = +8'shz8; $display("%b", x); // zzzzzzzzzzzz1000
2360
2361        let op = Op::Add;
2362        let mut cache = MaskCache::default();
2363
2364        let x00 = Value::from_str("8'h11").unwrap();
2365        let x01 = Value::from_str("8'hf2").unwrap();
2366        let x02 = Value::from_str("8'hx3").unwrap();
2367        let x03 = Value::from_str("8'hz4").unwrap();
2368        let x04 = Value::from_str("8'sh15").unwrap();
2369        let x05 = Value::from_str("8'shf6").unwrap();
2370        let x06 = Value::from_str("8'shx7").unwrap();
2371        let x07 = Value::from_str("8'shz8").unwrap();
2372        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2373        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2374        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2375        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2376        let x04 = op.eval_value_unary(&x04, 16, true, &mut cache);
2377        let x05 = op.eval_value_unary(&x05, 16, true, &mut cache);
2378        let x06 = op.eval_value_unary(&x06, 16, true, &mut cache);
2379        let x07 = op.eval_value_unary(&x07, 16, true, &mut cache);
2380        assert_eq!(format!("{:b}", x00), "16'b0000000000010001");
2381        assert_eq!(format!("{:b}", x01), "16'b0000000011110010");
2382        assert_eq!(format!("{:b}", x02), "16'b00000000xxxx0011");
2383        assert_eq!(format!("{:b}", x03), "16'b00000000zzzz0100");
2384        assert_eq!(format!("{:b}", x04), "16'sb0000000000010101");
2385        assert_eq!(format!("{:b}", x05), "16'sb1111111111110110");
2386        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxxxx0111");
2387        assert_eq!(format!("{:b}", x07), "16'sbzzzzzzzzzzzz1000");
2388
2389        let x00 = Value::from_str("8'h11").unwrap();
2390        let x01 = Value::from_str("8'hf2").unwrap();
2391        let x02 = Value::from_str("8'hx3").unwrap();
2392        let x03 = Value::from_str("8'hz4").unwrap();
2393        let x04 = Value::from_str("8'sh15").unwrap();
2394        let x05 = Value::from_str("8'shf6").unwrap();
2395        let x06 = Value::from_str("8'shx7").unwrap();
2396        let x07 = Value::from_str("8'shz8").unwrap();
2397        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2398        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2399        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2400        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2401        let x04 = op.eval_value_unary(&x04, 68, true, &mut cache);
2402        let x05 = op.eval_value_unary(&x05, 68, true, &mut cache);
2403        let x06 = op.eval_value_unary(&x06, 68, true, &mut cache);
2404        let x07 = op.eval_value_unary(&x07, 68, true, &mut cache);
2405        assert_eq!(format!("{:x}", x00), "68'h00000000000000011");
2406        assert_eq!(format!("{:x}", x01), "68'h000000000000000f2");
2407        assert_eq!(format!("{:x}", x02), "68'h000000000000000x3");
2408        assert_eq!(format!("{:x}", x03), "68'h000000000000000z4");
2409        assert_eq!(format!("{:x}", x04), "68'sh00000000000000015");
2410        assert_eq!(format!("{:x}", x05), "68'shffffffffffffffff6");
2411        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxx7");
2412        assert_eq!(format!("{:x}", x07), "68'shzzzzzzzzzzzzzzzz8");
2413    }
2414
2415    #[test]
2416    fn unary_sub() {
2417        //x = -8'h11 ; $display("%b", x); // 1111111111101111
2418        //x = -8'hf2 ; $display("%b", x); // 1111111100001110
2419        //x = -8'hx3 ; $display("%b", x); // xxxxxxxxxxxxxxxx
2420        //x = -8'hz4 ; $display("%b", x); // xxxxxxxxxxxxxxxx
2421        //x = -8'sh15; $display("%b", x); // 1111111111101011
2422        //x = -8'shf6; $display("%b", x); // 0000000000001010
2423        //x = -8'shx7; $display("%b", x); // xxxxxxxxxxxxxxxx
2424        //x = -8'shz8; $display("%b", x); // xxxxxxxxxxxxxxxx
2425
2426        let op = Op::Sub;
2427        let mut cache = MaskCache::default();
2428
2429        let x00 = Value::from_str("8'h11").unwrap();
2430        let x01 = Value::from_str("8'hf2").unwrap();
2431        let x02 = Value::from_str("8'hx3").unwrap();
2432        let x03 = Value::from_str("8'hz4").unwrap();
2433        let x04 = Value::from_str("8'sh15").unwrap();
2434        let x05 = Value::from_str("8'shf6").unwrap();
2435        let x06 = Value::from_str("8'shx7").unwrap();
2436        let x07 = Value::from_str("8'shz8").unwrap();
2437        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2438        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2439        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2440        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2441        let x04 = op.eval_value_unary(&x04, 16, true, &mut cache);
2442        let x05 = op.eval_value_unary(&x05, 16, true, &mut cache);
2443        let x06 = op.eval_value_unary(&x06, 16, true, &mut cache);
2444        let x07 = op.eval_value_unary(&x07, 16, true, &mut cache);
2445        assert_eq!(format!("{:b}", x00), "16'b1111111111101111");
2446        assert_eq!(format!("{:b}", x01), "16'b1111111100001110");
2447        assert_eq!(format!("{:b}", x02), "16'bxxxxxxxxxxxxxxxx");
2448        assert_eq!(format!("{:b}", x03), "16'bxxxxxxxxxxxxxxxx");
2449        assert_eq!(format!("{:b}", x04), "16'sb1111111111101011");
2450        assert_eq!(format!("{:b}", x05), "16'sb0000000000001010");
2451        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxxxxxxxx");
2452        assert_eq!(format!("{:b}", x07), "16'sbxxxxxxxxxxxxxxxx");
2453
2454        let x00 = Value::from_str("8'h11").unwrap();
2455        let x01 = Value::from_str("8'hf2").unwrap();
2456        let x02 = Value::from_str("8'hx3").unwrap();
2457        let x03 = Value::from_str("8'hz4").unwrap();
2458        let x04 = Value::from_str("8'sh15").unwrap();
2459        let x05 = Value::from_str("8'shf6").unwrap();
2460        let x06 = Value::from_str("8'shx7").unwrap();
2461        let x07 = Value::from_str("8'shz8").unwrap();
2462        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2463        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2464        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2465        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2466        let x04 = op.eval_value_unary(&x04, 68, true, &mut cache);
2467        let x05 = op.eval_value_unary(&x05, 68, true, &mut cache);
2468        let x06 = op.eval_value_unary(&x06, 68, true, &mut cache);
2469        let x07 = op.eval_value_unary(&x07, 68, true, &mut cache);
2470        assert_eq!(format!("{:x}", x00), "68'hfffffffffffffffef");
2471        assert_eq!(format!("{:x}", x01), "68'hfffffffffffffff0e");
2472        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxx");
2473        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxx");
2474        assert_eq!(format!("{:x}", x04), "68'shfffffffffffffffeb");
2475        assert_eq!(format!("{:x}", x05), "68'sh0000000000000000a");
2476        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxxx");
2477        assert_eq!(format!("{:x}", x07), "68'shxxxxxxxxxxxxxxxxx");
2478    }
2479
2480    #[test]
2481    fn unary_bit_not() {
2482        //x = ~8'h11 ; $display("%b", x); // 1111111111101110
2483        //x = ~8'hf2 ; $display("%b", x); // 1111111100001101
2484        //x = ~8'hx3 ; $display("%b", x); // 11111111xxxx1100
2485        //x = ~8'hz4 ; $display("%b", x); // 11111111xxxx1011
2486        //x = ~8'sh15; $display("%b", x); // 1111111111101010
2487        //x = ~8'shf6; $display("%b", x); // 0000000000001001
2488        //x = ~8'shx7; $display("%b", x); // xxxxxxxxxxxx1000
2489        //x = ~8'shz8; $display("%b", x); // xxxxxxxxxxxx0111
2490
2491        let op = Op::BitNot;
2492        let mut cache = MaskCache::default();
2493
2494        let x00 = Value::from_str("8'h11").unwrap();
2495        let x01 = Value::from_str("8'hf2").unwrap();
2496        let x02 = Value::from_str("8'hx3").unwrap();
2497        let x03 = Value::from_str("8'hz4").unwrap();
2498        let x04 = Value::from_str("8'sh15").unwrap();
2499        let x05 = Value::from_str("8'shf6").unwrap();
2500        let x06 = Value::from_str("8'shx7").unwrap();
2501        let x07 = Value::from_str("8'shz8").unwrap();
2502        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2503        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2504        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2505        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2506        let x04 = op.eval_value_unary(&x04, 16, true, &mut cache);
2507        let x05 = op.eval_value_unary(&x05, 16, true, &mut cache);
2508        let x06 = op.eval_value_unary(&x06, 16, true, &mut cache);
2509        let x07 = op.eval_value_unary(&x07, 16, true, &mut cache);
2510        assert_eq!(format!("{:b}", x00), "16'b1111111111101110");
2511        assert_eq!(format!("{:b}", x01), "16'b1111111100001101");
2512        assert_eq!(format!("{:b}", x02), "16'b11111111xxxx1100");
2513        assert_eq!(format!("{:b}", x03), "16'b11111111xxxx1011");
2514        assert_eq!(format!("{:b}", x04), "16'sb1111111111101010");
2515        assert_eq!(format!("{:b}", x05), "16'sb0000000000001001");
2516        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxxxx1000");
2517        assert_eq!(format!("{:b}", x07), "16'sbxxxxxxxxxxxx0111");
2518
2519        let x00 = Value::from_str("8'h11").unwrap();
2520        let x01 = Value::from_str("8'hf2").unwrap();
2521        let x02 = Value::from_str("8'hx3").unwrap();
2522        let x03 = Value::from_str("8'hz4").unwrap();
2523        let x04 = Value::from_str("8'sh15").unwrap();
2524        let x05 = Value::from_str("8'shf6").unwrap();
2525        let x06 = Value::from_str("8'shx7").unwrap();
2526        let x07 = Value::from_str("8'shz8").unwrap();
2527        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2528        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2529        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2530        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2531        let x04 = op.eval_value_unary(&x04, 68, true, &mut cache);
2532        let x05 = op.eval_value_unary(&x05, 68, true, &mut cache);
2533        let x06 = op.eval_value_unary(&x06, 68, true, &mut cache);
2534        let x07 = op.eval_value_unary(&x07, 68, true, &mut cache);
2535        assert_eq!(format!("{:x}", x00), "68'hfffffffffffffffee");
2536        assert_eq!(format!("{:x}", x01), "68'hfffffffffffffff0d");
2537        assert_eq!(format!("{:x}", x02), "68'hfffffffffffffffxc");
2538        assert_eq!(format!("{:x}", x03), "68'hfffffffffffffffxb");
2539        assert_eq!(format!("{:x}", x04), "68'shfffffffffffffffea");
2540        assert_eq!(format!("{:x}", x05), "68'sh00000000000000009");
2541        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxx8");
2542        assert_eq!(format!("{:x}", x07), "68'shxxxxxxxxxxxxxxxx7");
2543    }
2544
2545    #[test]
2546    fn unary_bit_and() {
2547        //x = &8'h11; $display("%b", x); // 0000000000000000
2548        //x = &8'hff; $display("%b", x); // 0000000000000001
2549        //x = &8'hxx; $display("%b", x); // 000000000000000x
2550        //x = &8'hzz; $display("%b", x); // 000000000000000x
2551        //x = &8'h1x; $display("%b", x); // 0000000000000000
2552        //x = &8'h1z; $display("%b", x); // 0000000000000000
2553        //x = &8'hfx; $display("%b", x); // 000000000000000x
2554        //x = &8'hxz; $display("%b", x); // 000000000000000x
2555
2556        let op = Op::BitAnd;
2557        let mut cache = MaskCache::default();
2558
2559        let x00 = Value::from_str("8'h11").unwrap();
2560        let x01 = Value::from_str("8'hff").unwrap();
2561        let x02 = Value::from_str("8'hxx").unwrap();
2562        let x03 = Value::from_str("8'hzz").unwrap();
2563        let x04 = Value::from_str("8'h1x").unwrap();
2564        let x05 = Value::from_str("8'h1z").unwrap();
2565        let x06 = Value::from_str("8'hfx").unwrap();
2566        let x07 = Value::from_str("8'hxz").unwrap();
2567        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2568        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2569        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2570        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2571        let x04 = op.eval_value_unary(&x04, 16, false, &mut cache);
2572        let x05 = op.eval_value_unary(&x05, 16, false, &mut cache);
2573        let x06 = op.eval_value_unary(&x06, 16, false, &mut cache);
2574        let x07 = op.eval_value_unary(&x07, 16, false, &mut cache);
2575        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
2576        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
2577        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
2578        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
2579        assert_eq!(format!("{:b}", x04), "16'b0000000000000000");
2580        assert_eq!(format!("{:b}", x05), "16'b0000000000000000");
2581        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
2582        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
2583
2584        let x00 = Value::from_str("68'h11111111111111111").unwrap();
2585        let x01 = Value::from_str("68'hfffffffffffffffff").unwrap();
2586        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
2587        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
2588        let x04 = Value::from_str("68'h1111111111111111x").unwrap();
2589        let x05 = Value::from_str("68'h1111111111111111z").unwrap();
2590        let x06 = Value::from_str("68'hffffffffffffffffx").unwrap();
2591        let x07 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
2592        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2593        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2594        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2595        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2596        let x04 = op.eval_value_unary(&x04, 68, false, &mut cache);
2597        let x05 = op.eval_value_unary(&x05, 68, false, &mut cache);
2598        let x06 = op.eval_value_unary(&x06, 68, false, &mut cache);
2599        let x07 = op.eval_value_unary(&x07, 68, false, &mut cache);
2600        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
2601        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
2602        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
2603        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
2604        assert_eq!(format!("{:x}", x04), "68'h00000000000000000");
2605        assert_eq!(format!("{:x}", x05), "68'h00000000000000000");
2606        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
2607        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
2608    }
2609
2610    #[test]
2611    fn unary_bit_nand() {
2612        //x = ~&8'h11; $display("%b", x); // 0000000000000001
2613        //x = ~&8'hff; $display("%b", x); // 0000000000000000
2614        //x = ~&8'hxx; $display("%b", x); // 000000000000000x
2615        //x = ~&8'hzz; $display("%b", x); // 000000000000000x
2616        //x = ~&8'h1x; $display("%b", x); // 0000000000000001
2617        //x = ~&8'h1z; $display("%b", x); // 0000000000000001
2618        //x = ~&8'hfx; $display("%b", x); // 000000000000000x
2619        //x = ~&8'hxz; $display("%b", x); // 000000000000000x
2620
2621        let op = Op::BitNand;
2622        let mut cache = MaskCache::default();
2623
2624        let x00 = Value::from_str("8'h11").unwrap();
2625        let x01 = Value::from_str("8'hff").unwrap();
2626        let x02 = Value::from_str("8'hxx").unwrap();
2627        let x03 = Value::from_str("8'hzz").unwrap();
2628        let x04 = Value::from_str("8'h1x").unwrap();
2629        let x05 = Value::from_str("8'h1z").unwrap();
2630        let x06 = Value::from_str("8'hfx").unwrap();
2631        let x07 = Value::from_str("8'hxz").unwrap();
2632        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2633        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2634        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2635        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2636        let x04 = op.eval_value_unary(&x04, 16, false, &mut cache);
2637        let x05 = op.eval_value_unary(&x05, 16, false, &mut cache);
2638        let x06 = op.eval_value_unary(&x06, 16, false, &mut cache);
2639        let x07 = op.eval_value_unary(&x07, 16, false, &mut cache);
2640        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
2641        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
2642        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
2643        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
2644        assert_eq!(format!("{:b}", x04), "16'b0000000000000001");
2645        assert_eq!(format!("{:b}", x05), "16'b0000000000000001");
2646        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
2647        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
2648
2649        let x00 = Value::from_str("68'h11111111111111111").unwrap();
2650        let x01 = Value::from_str("68'hfffffffffffffffff").unwrap();
2651        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
2652        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
2653        let x04 = Value::from_str("68'h1111111111111111x").unwrap();
2654        let x05 = Value::from_str("68'h1111111111111111z").unwrap();
2655        let x06 = Value::from_str("68'hffffffffffffffffx").unwrap();
2656        let x07 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
2657        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2658        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2659        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2660        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2661        let x04 = op.eval_value_unary(&x04, 68, false, &mut cache);
2662        let x05 = op.eval_value_unary(&x05, 68, false, &mut cache);
2663        let x06 = op.eval_value_unary(&x06, 68, false, &mut cache);
2664        let x07 = op.eval_value_unary(&x07, 68, false, &mut cache);
2665        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
2666        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
2667        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
2668        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
2669        assert_eq!(format!("{:x}", x04), "68'h00000000000000001");
2670        assert_eq!(format!("{:x}", x05), "68'h00000000000000001");
2671        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
2672        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
2673    }
2674
2675    #[test]
2676    fn unary_bit_or() {
2677        //x = |8'h00; $display("%b", x); // 0000000000000000
2678        //x = |8'h11; $display("%b", x); // 0000000000000001
2679        //x = |8'hxx; $display("%b", x); // 000000000000000x
2680        //x = |8'hzz; $display("%b", x); // 000000000000000x
2681        //x = |8'h0x; $display("%b", x); // 000000000000000x
2682        //x = |8'h0z; $display("%b", x); // 000000000000000x
2683        //x = |8'h1x; $display("%b", x); // 0000000000000001
2684        //x = |8'h1z; $display("%b", x); // 0000000000000001
2685
2686        let op = Op::BitOr;
2687        let mut cache = MaskCache::default();
2688
2689        let x00 = Value::from_str("8'h00").unwrap();
2690        let x01 = Value::from_str("8'h11").unwrap();
2691        let x02 = Value::from_str("8'hxx").unwrap();
2692        let x03 = Value::from_str("8'hzz").unwrap();
2693        let x04 = Value::from_str("8'h0x").unwrap();
2694        let x05 = Value::from_str("8'h0z").unwrap();
2695        let x06 = Value::from_str("8'h1x").unwrap();
2696        let x07 = Value::from_str("8'h1z").unwrap();
2697        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2698        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2699        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2700        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2701        let x04 = op.eval_value_unary(&x04, 16, false, &mut cache);
2702        let x05 = op.eval_value_unary(&x05, 16, false, &mut cache);
2703        let x06 = op.eval_value_unary(&x06, 16, false, &mut cache);
2704        let x07 = op.eval_value_unary(&x07, 16, false, &mut cache);
2705        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
2706        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
2707        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
2708        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
2709        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
2710        assert_eq!(format!("{:b}", x05), "16'b000000000000000x");
2711        assert_eq!(format!("{:b}", x06), "16'b0000000000000001");
2712        assert_eq!(format!("{:b}", x07), "16'b0000000000000001");
2713
2714        let x00 = Value::from_str("68'h00000000000000000").unwrap();
2715        let x01 = Value::from_str("68'h11111111111111111").unwrap();
2716        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
2717        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
2718        let x04 = Value::from_str("68'h0000000000000000x").unwrap();
2719        let x05 = Value::from_str("68'h0000000000000000z").unwrap();
2720        let x06 = Value::from_str("68'h1111111111111111x").unwrap();
2721        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
2722        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2723        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2724        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2725        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2726        let x04 = op.eval_value_unary(&x04, 68, false, &mut cache);
2727        let x05 = op.eval_value_unary(&x05, 68, false, &mut cache);
2728        let x06 = op.eval_value_unary(&x06, 68, false, &mut cache);
2729        let x07 = op.eval_value_unary(&x07, 68, false, &mut cache);
2730        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
2731        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
2732        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
2733        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
2734        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
2735        assert_eq!(format!("{:x}", x05), "68'h0000000000000000X");
2736        assert_eq!(format!("{:x}", x06), "68'h00000000000000001");
2737        assert_eq!(format!("{:x}", x07), "68'h00000000000000001");
2738    }
2739
2740    #[test]
2741    fn unary_bit_nor() {
2742        //x = ~|8'h00; $display("%b", x); // 0000000000000001
2743        //x = ~|8'h11; $display("%b", x); // 0000000000000000
2744        //x = ~|8'hxx; $display("%b", x); // 000000000000000x
2745        //x = ~|8'hzz; $display("%b", x); // 000000000000000x
2746        //x = ~|8'h0x; $display("%b", x); // 000000000000000x
2747        //x = ~|8'h0z; $display("%b", x); // 000000000000000x
2748        //x = ~|8'h1x; $display("%b", x); // 0000000000000000
2749        //x = ~|8'h1z; $display("%b", x); // 0000000000000000
2750
2751        let op = Op::BitNor;
2752        let mut cache = MaskCache::default();
2753
2754        let x00 = Value::from_str("8'h00").unwrap();
2755        let x01 = Value::from_str("8'h11").unwrap();
2756        let x02 = Value::from_str("8'hxx").unwrap();
2757        let x03 = Value::from_str("8'hzz").unwrap();
2758        let x04 = Value::from_str("8'h0x").unwrap();
2759        let x05 = Value::from_str("8'h0z").unwrap();
2760        let x06 = Value::from_str("8'h1x").unwrap();
2761        let x07 = Value::from_str("8'h1z").unwrap();
2762        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2763        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2764        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2765        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2766        let x04 = op.eval_value_unary(&x04, 16, false, &mut cache);
2767        let x05 = op.eval_value_unary(&x05, 16, false, &mut cache);
2768        let x06 = op.eval_value_unary(&x06, 16, false, &mut cache);
2769        let x07 = op.eval_value_unary(&x07, 16, false, &mut cache);
2770        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
2771        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
2772        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
2773        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
2774        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
2775        assert_eq!(format!("{:b}", x05), "16'b000000000000000x");
2776        assert_eq!(format!("{:b}", x06), "16'b0000000000000000");
2777        assert_eq!(format!("{:b}", x07), "16'b0000000000000000");
2778
2779        let x00 = Value::from_str("68'h00000000000000000").unwrap();
2780        let x01 = Value::from_str("68'h11111111111111111").unwrap();
2781        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
2782        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
2783        let x04 = Value::from_str("68'h0000000000000000x").unwrap();
2784        let x05 = Value::from_str("68'h0000000000000000z").unwrap();
2785        let x06 = Value::from_str("68'h1111111111111111x").unwrap();
2786        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
2787        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2788        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2789        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2790        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2791        let x04 = op.eval_value_unary(&x04, 68, false, &mut cache);
2792        let x05 = op.eval_value_unary(&x05, 68, false, &mut cache);
2793        let x06 = op.eval_value_unary(&x06, 68, false, &mut cache);
2794        let x07 = op.eval_value_unary(&x07, 68, false, &mut cache);
2795        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
2796        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
2797        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
2798        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
2799        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
2800        assert_eq!(format!("{:x}", x05), "68'h0000000000000000X");
2801        assert_eq!(format!("{:x}", x06), "68'h00000000000000000");
2802        assert_eq!(format!("{:x}", x07), "68'h00000000000000000");
2803    }
2804
2805    #[test]
2806    fn unary_bit_xor() {
2807        //x = ^8'h00; $display("%b", x); // 0000000000000000
2808        //x = ^8'h01; $display("%b", x); // 0000000000000001
2809        //x = ^8'hxx; $display("%b", x); // 000000000000000x
2810        //x = ^8'hzz; $display("%b", x); // 000000000000000x
2811        //x = ^8'h0x; $display("%b", x); // 000000000000000x
2812        //x = ^8'h0z; $display("%b", x); // 000000000000000x
2813        //x = ^8'h1x; $display("%b", x); // 000000000000000x
2814        //x = ^8'h1z; $display("%b", x); // 000000000000000x
2815
2816        let op = Op::BitXor;
2817        let mut cache = MaskCache::default();
2818
2819        let x00 = Value::from_str("8'h00").unwrap();
2820        let x01 = Value::from_str("8'h01").unwrap();
2821        let x02 = Value::from_str("8'hxx").unwrap();
2822        let x03 = Value::from_str("8'hzz").unwrap();
2823        let x04 = Value::from_str("8'h0x").unwrap();
2824        let x05 = Value::from_str("8'h0z").unwrap();
2825        let x06 = Value::from_str("8'h1x").unwrap();
2826        let x07 = Value::from_str("8'h1z").unwrap();
2827        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2828        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2829        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2830        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2831        let x04 = op.eval_value_unary(&x04, 16, false, &mut cache);
2832        let x05 = op.eval_value_unary(&x05, 16, false, &mut cache);
2833        let x06 = op.eval_value_unary(&x06, 16, false, &mut cache);
2834        let x07 = op.eval_value_unary(&x07, 16, false, &mut cache);
2835        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
2836        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
2837        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
2838        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
2839        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
2840        assert_eq!(format!("{:b}", x05), "16'b000000000000000x");
2841        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
2842        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
2843
2844        let x00 = Value::from_str("68'h00000000000000000").unwrap();
2845        let x01 = Value::from_str("68'h11111111111111111").unwrap();
2846        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
2847        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
2848        let x04 = Value::from_str("68'h0000000000000000x").unwrap();
2849        let x05 = Value::from_str("68'h0000000000000000z").unwrap();
2850        let x06 = Value::from_str("68'h1111111111111111x").unwrap();
2851        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
2852        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2853        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2854        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2855        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2856        let x04 = op.eval_value_unary(&x04, 68, false, &mut cache);
2857        let x05 = op.eval_value_unary(&x05, 68, false, &mut cache);
2858        let x06 = op.eval_value_unary(&x06, 68, false, &mut cache);
2859        let x07 = op.eval_value_unary(&x07, 68, false, &mut cache);
2860        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
2861        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
2862        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
2863        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
2864        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
2865        assert_eq!(format!("{:x}", x05), "68'h0000000000000000X");
2866        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
2867        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
2868    }
2869
2870    #[test]
2871    fn unary_bit_xnor() {
2872        //x = ~^8'h00; $display("%b", x); // 0000000000000001
2873        //x = ~^8'h01; $display("%b", x); // 0000000000000000
2874        //x = ~^8'hxx; $display("%b", x); // 000000000000000x
2875        //x = ~^8'hzz; $display("%b", x); // 000000000000000x
2876        //x = ~^8'h0x; $display("%b", x); // 000000000000000x
2877        //x = ~^8'h0z; $display("%b", x); // 000000000000000x
2878        //x = ~^8'h1x; $display("%b", x); // 000000000000000x
2879        //x = ~^8'h1z; $display("%b", x); // 000000000000000x
2880
2881        let op = Op::BitXnor;
2882        let mut cache = MaskCache::default();
2883
2884        let x00 = Value::from_str("8'h00").unwrap();
2885        let x01 = Value::from_str("8'h01").unwrap();
2886        let x02 = Value::from_str("8'hxx").unwrap();
2887        let x03 = Value::from_str("8'hzz").unwrap();
2888        let x04 = Value::from_str("8'h0x").unwrap();
2889        let x05 = Value::from_str("8'h0z").unwrap();
2890        let x06 = Value::from_str("8'h1x").unwrap();
2891        let x07 = Value::from_str("8'h1z").unwrap();
2892        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2893        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2894        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2895        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2896        let x04 = op.eval_value_unary(&x04, 16, false, &mut cache);
2897        let x05 = op.eval_value_unary(&x05, 16, false, &mut cache);
2898        let x06 = op.eval_value_unary(&x06, 16, false, &mut cache);
2899        let x07 = op.eval_value_unary(&x07, 16, false, &mut cache);
2900        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
2901        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
2902        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
2903        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
2904        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
2905        assert_eq!(format!("{:b}", x05), "16'b000000000000000x");
2906        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
2907        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
2908
2909        let x00 = Value::from_str("68'h00000000000000000").unwrap();
2910        let x01 = Value::from_str("68'h11111111111111111").unwrap();
2911        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
2912        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
2913        let x04 = Value::from_str("68'h0000000000000000x").unwrap();
2914        let x05 = Value::from_str("68'h0000000000000000z").unwrap();
2915        let x06 = Value::from_str("68'h1111111111111111x").unwrap();
2916        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
2917        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2918        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2919        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2920        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2921        let x04 = op.eval_value_unary(&x04, 68, false, &mut cache);
2922        let x05 = op.eval_value_unary(&x05, 68, false, &mut cache);
2923        let x06 = op.eval_value_unary(&x06, 68, false, &mut cache);
2924        let x07 = op.eval_value_unary(&x07, 68, false, &mut cache);
2925        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
2926        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
2927        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
2928        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
2929        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
2930        assert_eq!(format!("{:x}", x05), "68'h0000000000000000X");
2931        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
2932        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
2933    }
2934
2935    #[test]
2936    fn unary_logical_not() {
2937        //x = !8'h00; $display("%b", x); // 0000000000000001
2938        //x = !8'h01; $display("%b", x); // 0000000000000000
2939        //x = !8'hxx; $display("%b", x); // 000000000000000x
2940        //x = !8'hzz; $display("%b", x); // 000000000000000x
2941        //x = !8'h0x; $display("%b", x); // 000000000000000x
2942        //x = !8'h0z; $display("%b", x); // 000000000000000x
2943        //x = !8'h1x; $display("%b", x); // 0000000000000000
2944        //x = !8'h1z; $display("%b", x); // 0000000000000000
2945
2946        let op = Op::LogicNot;
2947        let mut cache = MaskCache::default();
2948
2949        let x00 = Value::from_str("8'h00").unwrap();
2950        let x01 = Value::from_str("8'h01").unwrap();
2951        let x02 = Value::from_str("8'hxx").unwrap();
2952        let x03 = Value::from_str("8'hzz").unwrap();
2953        let x04 = Value::from_str("8'h0x").unwrap();
2954        let x05 = Value::from_str("8'h0z").unwrap();
2955        let x06 = Value::from_str("8'h1x").unwrap();
2956        let x07 = Value::from_str("8'h1z").unwrap();
2957        let x00 = op.eval_value_unary(&x00, 16, false, &mut cache);
2958        let x01 = op.eval_value_unary(&x01, 16, false, &mut cache);
2959        let x02 = op.eval_value_unary(&x02, 16, false, &mut cache);
2960        let x03 = op.eval_value_unary(&x03, 16, false, &mut cache);
2961        let x04 = op.eval_value_unary(&x04, 16, false, &mut cache);
2962        let x05 = op.eval_value_unary(&x05, 16, false, &mut cache);
2963        let x06 = op.eval_value_unary(&x06, 16, false, &mut cache);
2964        let x07 = op.eval_value_unary(&x07, 16, false, &mut cache);
2965        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
2966        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
2967        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
2968        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
2969        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
2970        assert_eq!(format!("{:b}", x05), "16'b000000000000000x");
2971        assert_eq!(format!("{:b}", x06), "16'b0000000000000000");
2972        assert_eq!(format!("{:b}", x07), "16'b0000000000000000");
2973
2974        let x00 = Value::from_str("68'h00000000000000000").unwrap();
2975        let x01 = Value::from_str("68'h11111111111111111").unwrap();
2976        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
2977        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
2978        let x04 = Value::from_str("68'h0000000000000000x").unwrap();
2979        let x05 = Value::from_str("68'h0000000000000000z").unwrap();
2980        let x06 = Value::from_str("68'h1111111111111111x").unwrap();
2981        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
2982        let x00 = op.eval_value_unary(&x00, 68, false, &mut cache);
2983        let x01 = op.eval_value_unary(&x01, 68, false, &mut cache);
2984        let x02 = op.eval_value_unary(&x02, 68, false, &mut cache);
2985        let x03 = op.eval_value_unary(&x03, 68, false, &mut cache);
2986        let x04 = op.eval_value_unary(&x04, 68, false, &mut cache);
2987        let x05 = op.eval_value_unary(&x05, 68, false, &mut cache);
2988        let x06 = op.eval_value_unary(&x06, 68, false, &mut cache);
2989        let x07 = op.eval_value_unary(&x07, 68, false, &mut cache);
2990        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
2991        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
2992        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
2993        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
2994        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
2995        assert_eq!(format!("{:x}", x05), "68'h0000000000000000X");
2996        assert_eq!(format!("{:x}", x06), "68'h00000000000000000");
2997        assert_eq!(format!("{:x}", x07), "68'h00000000000000000");
2998    }
2999
3000    #[test]
3001    fn binary_add() {
3002        //x = 8'h01  + 8'h01 ; $display("%b", x); // 0000000000000010
3003        //x = 8'hf2  + 8'hf2 ; $display("%b", x); // 0000000111100100
3004        //x = 8'hx3  + 8'hx3 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3005        //x = 8'hz4  + 8'hz4 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3006        //x = 8'sh01 + 8'sh01; $display("%b", x); // 0000000000000010
3007        //x = 8'shf2 + 8'shf2; $display("%b", x); // 1111111111100100
3008        //x = 8'shx3 + 8'shx3; $display("%b", x); // xxxxxxxxxxxxxxxx
3009        //x = 8'shz4 + 8'shz4; $display("%b", x); // xxxxxxxxxxxxxxxx
3010
3011        let op = Op::Add;
3012        let mut cache = MaskCache::default();
3013
3014        let x00 = Value::from_str("8'h01").unwrap();
3015        let x01 = Value::from_str("8'hf2").unwrap();
3016        let x02 = Value::from_str("8'hx3").unwrap();
3017        let x03 = Value::from_str("8'hz4").unwrap();
3018        let x04 = Value::from_str("8'sh01").unwrap();
3019        let x05 = Value::from_str("8'shf2").unwrap();
3020        let x06 = Value::from_str("8'shx3").unwrap();
3021        let x07 = Value::from_str("8'shz4").unwrap();
3022        let x10 = Value::from_str("8'h01").unwrap();
3023        let x11 = Value::from_str("8'hf2").unwrap();
3024        let x12 = Value::from_str("8'hx3").unwrap();
3025        let x13 = Value::from_str("8'hz4").unwrap();
3026        let x14 = Value::from_str("8'sh01").unwrap();
3027        let x15 = Value::from_str("8'shf2").unwrap();
3028        let x16 = Value::from_str("8'shx3").unwrap();
3029        let x17 = Value::from_str("8'shz4").unwrap();
3030        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3031        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3032        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3033        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3034        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
3035        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
3036        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
3037        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
3038        assert_eq!(format!("{:b}", x00), "16'b0000000000000010");
3039        assert_eq!(format!("{:b}", x01), "16'b0000000111100100");
3040        assert_eq!(format!("{:b}", x02), "16'bxxxxxxxxxxxxxxxx");
3041        assert_eq!(format!("{:b}", x03), "16'bxxxxxxxxxxxxxxxx");
3042        assert_eq!(format!("{:b}", x04), "16'sb0000000000000010");
3043        assert_eq!(format!("{:b}", x05), "16'sb1111111111100100");
3044        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxxxxxxxx");
3045        assert_eq!(format!("{:b}", x07), "16'sbxxxxxxxxxxxxxxxx");
3046
3047        let x00 = Value::from_str("8'h01").unwrap();
3048        let x01 = Value::from_str("8'hf2").unwrap();
3049        let x02 = Value::from_str("8'hx3").unwrap();
3050        let x03 = Value::from_str("8'hz4").unwrap();
3051        let x04 = Value::from_str("8'sh01").unwrap();
3052        let x05 = Value::from_str("8'shf2").unwrap();
3053        let x06 = Value::from_str("8'shx3").unwrap();
3054        let x07 = Value::from_str("8'shz4").unwrap();
3055        let x10 = Value::from_str("8'h01").unwrap();
3056        let x11 = Value::from_str("8'hf2").unwrap();
3057        let x12 = Value::from_str("8'hx3").unwrap();
3058        let x13 = Value::from_str("8'hz4").unwrap();
3059        let x14 = Value::from_str("8'sh01").unwrap();
3060        let x15 = Value::from_str("8'shf2").unwrap();
3061        let x16 = Value::from_str("8'shx3").unwrap();
3062        let x17 = Value::from_str("8'shz4").unwrap();
3063        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3064        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3065        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3066        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3067        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
3068        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
3069        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
3070        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
3071        assert_eq!(format!("{:x}", x00), "68'h00000000000000002");
3072        assert_eq!(format!("{:x}", x01), "68'h000000000000001e4");
3073        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxx");
3074        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxx");
3075        assert_eq!(format!("{:x}", x04), "68'sh00000000000000002");
3076        assert_eq!(format!("{:x}", x05), "68'shfffffffffffffffe4");
3077        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxxx");
3078        assert_eq!(format!("{:x}", x07), "68'shxxxxxxxxxxxxxxxxx");
3079    }
3080
3081    #[test]
3082    fn binary_sub() {
3083        //x = 8'h01  - 8'hf2 ; $display("%b", x); // 1111111100001111
3084        //x = 8'hf2  - 8'h03 ; $display("%b", x); // 0000000011101111
3085        //x = 8'hx3  - 8'hx4 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3086        //x = 8'hz4  - 8'hz5 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3087        //x = 8'sh01 - 8'shf2; $display("%b", x); // 0000000000001111
3088        //x = 8'shf2 - 8'sh03; $display("%b", x); // 1111111111101111
3089        //x = 8'shx3 - 8'shx4; $display("%b", x); // xxxxxxxxxxxxxxxx
3090        //x = 8'shz4 - 8'shz5; $display("%b", x); // xxxxxxxxxxxxxxxx
3091
3092        let op = Op::Sub;
3093        let mut cache = MaskCache::default();
3094
3095        let x00 = Value::from_str("8'h01").unwrap();
3096        let x01 = Value::from_str("8'hf2").unwrap();
3097        let x02 = Value::from_str("8'hx3").unwrap();
3098        let x03 = Value::from_str("8'hz4").unwrap();
3099        let x04 = Value::from_str("8'sh01").unwrap();
3100        let x05 = Value::from_str("8'shf2").unwrap();
3101        let x06 = Value::from_str("8'shx3").unwrap();
3102        let x07 = Value::from_str("8'shz4").unwrap();
3103        let x10 = Value::from_str("8'hf2").unwrap();
3104        let x11 = Value::from_str("8'h03").unwrap();
3105        let x12 = Value::from_str("8'hx4").unwrap();
3106        let x13 = Value::from_str("8'hz5").unwrap();
3107        let x14 = Value::from_str("8'shf2").unwrap();
3108        let x15 = Value::from_str("8'sh03").unwrap();
3109        let x16 = Value::from_str("8'shx4").unwrap();
3110        let x17 = Value::from_str("8'shz5").unwrap();
3111        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3112        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3113        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3114        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3115        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
3116        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
3117        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
3118        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
3119        assert_eq!(format!("{:b}", x00), "16'b1111111100001111");
3120        assert_eq!(format!("{:b}", x01), "16'b0000000011101111");
3121        assert_eq!(format!("{:b}", x02), "16'bxxxxxxxxxxxxxxxx");
3122        assert_eq!(format!("{:b}", x03), "16'bxxxxxxxxxxxxxxxx");
3123        assert_eq!(format!("{:b}", x04), "16'sb0000000000001111");
3124        assert_eq!(format!("{:b}", x05), "16'sb1111111111101111");
3125        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxxxxxxxx");
3126        assert_eq!(format!("{:b}", x07), "16'sbxxxxxxxxxxxxxxxx");
3127
3128        let x00 = Value::from_str("8'h01").unwrap();
3129        let x01 = Value::from_str("8'hf2").unwrap();
3130        let x02 = Value::from_str("8'hx3").unwrap();
3131        let x03 = Value::from_str("8'hz4").unwrap();
3132        let x04 = Value::from_str("8'sh01").unwrap();
3133        let x05 = Value::from_str("8'shf2").unwrap();
3134        let x06 = Value::from_str("8'shx3").unwrap();
3135        let x07 = Value::from_str("8'shz4").unwrap();
3136        let x10 = Value::from_str("8'hf2").unwrap();
3137        let x11 = Value::from_str("8'h03").unwrap();
3138        let x12 = Value::from_str("8'hx4").unwrap();
3139        let x13 = Value::from_str("8'hz5").unwrap();
3140        let x14 = Value::from_str("8'shf2").unwrap();
3141        let x15 = Value::from_str("8'sh03").unwrap();
3142        let x16 = Value::from_str("8'shx4").unwrap();
3143        let x17 = Value::from_str("8'shz5").unwrap();
3144        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3145        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3146        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3147        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3148        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
3149        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
3150        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
3151        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
3152        assert_eq!(format!("{:x}", x00), "68'hfffffffffffffff0f");
3153        assert_eq!(format!("{:x}", x01), "68'h000000000000000ef");
3154        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxx");
3155        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxx");
3156        assert_eq!(format!("{:x}", x04), "68'sh0000000000000000f");
3157        assert_eq!(format!("{:x}", x05), "68'shfffffffffffffffef");
3158        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxxx");
3159        assert_eq!(format!("{:x}", x07), "68'shxxxxxxxxxxxxxxxxx");
3160    }
3161
3162    #[test]
3163    fn binary_mul() {
3164        //x = 8'h01  * 8'h01 ; $display("%b", x); // 0000000000000001
3165        //x = 8'hf2  * 8'hf2 ; $display("%b", x); // 1110010011000100
3166        //x = 8'hx3  * 8'hx3 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3167        //x = 8'hz4  * 8'hz4 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3168        //x = 8'sh01 * 8'sh01; $display("%b", x); // 0000000000000001
3169        //x = 8'shf2 * 8'shf2; $display("%b", x); // 0000000011000100
3170        //x = 8'shf3 * 8'sh03; $display("%b", x); // 1111111111011001
3171        //x = 8'shz4 * 8'shz4; $display("%b", x); // xxxxxxxxxxxxxxxx
3172
3173        let op = Op::Mul;
3174        let mut cache = MaskCache::default();
3175
3176        let x00 = Value::from_str("8'h01").unwrap();
3177        let x01 = Value::from_str("8'hf2").unwrap();
3178        let x02 = Value::from_str("8'hx3").unwrap();
3179        let x03 = Value::from_str("8'hz4").unwrap();
3180        let x04 = Value::from_str("8'sh01").unwrap();
3181        let x05 = Value::from_str("8'shf2").unwrap();
3182        let x06 = Value::from_str("8'shf3").unwrap();
3183        let x07 = Value::from_str("8'shz4").unwrap();
3184        let x10 = Value::from_str("8'h01").unwrap();
3185        let x11 = Value::from_str("8'hf2").unwrap();
3186        let x12 = Value::from_str("8'hx3").unwrap();
3187        let x13 = Value::from_str("8'hz4").unwrap();
3188        let x14 = Value::from_str("8'sh01").unwrap();
3189        let x15 = Value::from_str("8'shf2").unwrap();
3190        let x16 = Value::from_str("8'sh03").unwrap();
3191        let x17 = Value::from_str("8'shz4").unwrap();
3192        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3193        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3194        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3195        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3196        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
3197        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
3198        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
3199        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
3200        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
3201        assert_eq!(format!("{:b}", x01), "16'b1110010011000100");
3202        assert_eq!(format!("{:b}", x02), "16'bxxxxxxxxxxxxxxxx");
3203        assert_eq!(format!("{:b}", x03), "16'bxxxxxxxxxxxxxxxx");
3204        assert_eq!(format!("{:b}", x04), "16'sb0000000000000001");
3205        assert_eq!(format!("{:b}", x05), "16'sb0000000011000100");
3206        assert_eq!(format!("{:b}", x06), "16'sb1111111111011001");
3207        assert_eq!(format!("{:b}", x07), "16'sbxxxxxxxxxxxxxxxx");
3208
3209        let x00 = Value::from_str("8'h01").unwrap();
3210        let x01 = Value::from_str("8'hf2").unwrap();
3211        let x02 = Value::from_str("8'hx3").unwrap();
3212        let x03 = Value::from_str("8'hz4").unwrap();
3213        let x04 = Value::from_str("8'sh01").unwrap();
3214        let x05 = Value::from_str("8'shf2").unwrap();
3215        let x06 = Value::from_str("8'shf3").unwrap();
3216        let x07 = Value::from_str("8'shz4").unwrap();
3217        let x10 = Value::from_str("8'h01").unwrap();
3218        let x11 = Value::from_str("8'hf2").unwrap();
3219        let x12 = Value::from_str("8'hx3").unwrap();
3220        let x13 = Value::from_str("8'hz4").unwrap();
3221        let x14 = Value::from_str("8'sh01").unwrap();
3222        let x15 = Value::from_str("8'shf2").unwrap();
3223        let x16 = Value::from_str("8'sh03").unwrap();
3224        let x17 = Value::from_str("8'shz4").unwrap();
3225        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3226        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3227        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3228        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3229        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
3230        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
3231        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
3232        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
3233        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
3234        assert_eq!(format!("{:x}", x01), "68'h0000000000000e4c4");
3235        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxx");
3236        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxx");
3237        assert_eq!(format!("{:x}", x04), "68'sh00000000000000001");
3238        assert_eq!(format!("{:x}", x05), "68'sh000000000000000c4");
3239        assert_eq!(format!("{:x}", x06), "68'shfffffffffffffffd9");
3240        assert_eq!(format!("{:x}", x07), "68'shxxxxxxxxxxxxxxxxx");
3241    }
3242
3243    #[test]
3244    fn binary_div() {
3245        //x = 8'h02  / 8'h01 ; $display("%b", x); // 0000000000000010
3246        //x = 8'hf0  / 8'h02 ; $display("%b", x); // 0000000001111000
3247        //x = 8'hx3  / 8'hx3 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3248        //x = 8'hz4  / 8'hz4 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3249        //x = 8'sh02 / 8'sh01; $display("%b", x); // 0000000000000010
3250        //x = 8'shf0 / 8'sh02; $display("%b", x); // 1111111111111000
3251        //x = 8'shf3 / 8'shf3; $display("%b", x); // 0000000000000001
3252        //x = 8'sh01 / 8'sh00; $display("%b", x); // xxxxxxxxxxxxxxxx
3253
3254        let op = Op::Div;
3255        let mut cache = MaskCache::default();
3256
3257        let x00 = Value::from_str("8'h02").unwrap();
3258        let x01 = Value::from_str("8'hf0").unwrap();
3259        let x02 = Value::from_str("8'hx3").unwrap();
3260        let x03 = Value::from_str("8'hz4").unwrap();
3261        let x04 = Value::from_str("8'sh02").unwrap();
3262        let x05 = Value::from_str("8'shf0").unwrap();
3263        let x06 = Value::from_str("8'shf3").unwrap();
3264        let x07 = Value::from_str("8'sh01").unwrap();
3265        let x10 = Value::from_str("8'h01").unwrap();
3266        let x11 = Value::from_str("8'h02").unwrap();
3267        let x12 = Value::from_str("8'hx3").unwrap();
3268        let x13 = Value::from_str("8'hz4").unwrap();
3269        let x14 = Value::from_str("8'sh01").unwrap();
3270        let x15 = Value::from_str("8'sh02").unwrap();
3271        let x16 = Value::from_str("8'shf3").unwrap();
3272        let x17 = Value::from_str("8'sh00").unwrap();
3273        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3274        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3275        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3276        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3277        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
3278        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
3279        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
3280        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
3281        assert_eq!(format!("{:b}", x00), "16'b0000000000000010");
3282        assert_eq!(format!("{:b}", x01), "16'b0000000001111000");
3283        assert_eq!(format!("{:b}", x02), "16'bxxxxxxxxxxxxxxxx");
3284        assert_eq!(format!("{:b}", x03), "16'bxxxxxxxxxxxxxxxx");
3285        assert_eq!(format!("{:b}", x04), "16'sb0000000000000010");
3286        assert_eq!(format!("{:b}", x05), "16'sb1111111111111000");
3287        assert_eq!(format!("{:b}", x06), "16'sb0000000000000001");
3288        assert_eq!(format!("{:b}", x07), "16'sbxxxxxxxxxxxxxxxx");
3289
3290        let x00 = Value::from_str("8'h02").unwrap();
3291        let x01 = Value::from_str("8'hf0").unwrap();
3292        let x02 = Value::from_str("8'hx3").unwrap();
3293        let x03 = Value::from_str("8'hz4").unwrap();
3294        let x04 = Value::from_str("8'sh02").unwrap();
3295        let x05 = Value::from_str("8'shf0").unwrap();
3296        let x06 = Value::from_str("8'shf3").unwrap();
3297        let x07 = Value::from_str("8'sh01").unwrap();
3298        let x10 = Value::from_str("8'h01").unwrap();
3299        let x11 = Value::from_str("8'h02").unwrap();
3300        let x12 = Value::from_str("8'hx3").unwrap();
3301        let x13 = Value::from_str("8'hz4").unwrap();
3302        let x14 = Value::from_str("8'sh01").unwrap();
3303        let x15 = Value::from_str("8'sh02").unwrap();
3304        let x16 = Value::from_str("8'shf3").unwrap();
3305        let x17 = Value::from_str("8'sh00").unwrap();
3306        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3307        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3308        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3309        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3310        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
3311        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
3312        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
3313        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
3314        assert_eq!(format!("{:x}", x00), "68'h00000000000000002");
3315        assert_eq!(format!("{:x}", x01), "68'h00000000000000078");
3316        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxx");
3317        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxx");
3318        assert_eq!(format!("{:x}", x04), "68'sh00000000000000002");
3319        assert_eq!(format!("{:x}", x05), "68'shffffffffffffffff8");
3320        assert_eq!(format!("{:x}", x06), "68'sh00000000000000001");
3321        assert_eq!(format!("{:x}", x07), "68'shxxxxxxxxxxxxxxxxx");
3322    }
3323
3324    #[test]
3325    fn binary_rem() {
3326        //x = 8'h03  % 8'h01 ; $display("%b", x); // 0000000000000000
3327        //x = 8'hf1  % 8'h02 ; $display("%b", x); // 0000000000000001
3328        //x = 8'hx3  % 8'hx3 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3329        //x = 8'hz4  % 8'hz4 ; $display("%b", x); // xxxxxxxxxxxxxxxx
3330        //x = 8'sh03 % 8'sh02; $display("%b", x); // 0000000000000001
3331        //x = 8'shf1 % 8'sh02; $display("%b", x); // 1111111111111111
3332        //x = 8'shf1 % 8'shfc; $display("%b", x); // 1111111111111101
3333        //x = 8'sh03 % 8'shfc; $display("%b", x); // 0000000000000011
3334
3335        let op = Op::Rem;
3336        let mut cache = MaskCache::default();
3337
3338        let x00 = Value::from_str("8'h03").unwrap();
3339        let x01 = Value::from_str("8'hf1").unwrap();
3340        let x02 = Value::from_str("8'hx3").unwrap();
3341        let x03 = Value::from_str("8'hz4").unwrap();
3342        let x04 = Value::from_str("8'sh03").unwrap();
3343        let x05 = Value::from_str("8'shf1").unwrap();
3344        let x06 = Value::from_str("8'shf1").unwrap();
3345        let x07 = Value::from_str("8'sh03").unwrap();
3346        let x10 = Value::from_str("8'h01").unwrap();
3347        let x11 = Value::from_str("8'h02").unwrap();
3348        let x12 = Value::from_str("8'hx3").unwrap();
3349        let x13 = Value::from_str("8'hz4").unwrap();
3350        let x14 = Value::from_str("8'sh02").unwrap();
3351        let x15 = Value::from_str("8'sh02").unwrap();
3352        let x16 = Value::from_str("8'shfc").unwrap();
3353        let x17 = Value::from_str("8'shfc").unwrap();
3354        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3355        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3356        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3357        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3358        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
3359        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
3360        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
3361        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
3362        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
3363        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
3364        assert_eq!(format!("{:b}", x02), "16'bxxxxxxxxxxxxxxxx");
3365        assert_eq!(format!("{:b}", x03), "16'bxxxxxxxxxxxxxxxx");
3366        assert_eq!(format!("{:b}", x04), "16'sb0000000000000001");
3367        assert_eq!(format!("{:b}", x05), "16'sb1111111111111111");
3368        assert_eq!(format!("{:b}", x06), "16'sb1111111111111101");
3369        assert_eq!(format!("{:b}", x07), "16'sb0000000000000011");
3370
3371        let x00 = Value::from_str("8'h03").unwrap();
3372        let x01 = Value::from_str("8'hf1").unwrap();
3373        let x02 = Value::from_str("8'hx3").unwrap();
3374        let x03 = Value::from_str("8'hz4").unwrap();
3375        let x04 = Value::from_str("8'sh03").unwrap();
3376        let x05 = Value::from_str("8'shf1").unwrap();
3377        let x06 = Value::from_str("8'shf1").unwrap();
3378        let x07 = Value::from_str("8'sh03").unwrap();
3379        let x10 = Value::from_str("8'h01").unwrap();
3380        let x11 = Value::from_str("8'h02").unwrap();
3381        let x12 = Value::from_str("8'hx3").unwrap();
3382        let x13 = Value::from_str("8'hz4").unwrap();
3383        let x14 = Value::from_str("8'sh02").unwrap();
3384        let x15 = Value::from_str("8'sh02").unwrap();
3385        let x16 = Value::from_str("8'shfc").unwrap();
3386        let x17 = Value::from_str("8'shfc").unwrap();
3387        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3388        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3389        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3390        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3391        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
3392        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
3393        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
3394        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
3395        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
3396        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
3397        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxx");
3398        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxx");
3399        assert_eq!(format!("{:x}", x04), "68'sh00000000000000001");
3400        assert_eq!(format!("{:x}", x05), "68'shfffffffffffffffff");
3401        assert_eq!(format!("{:x}", x06), "68'shffffffffffffffffd");
3402        assert_eq!(format!("{:x}", x07), "68'sh00000000000000003");
3403    }
3404
3405    #[test]
3406    fn binary_bit_and() {
3407        //x = 8'hf3 & 8'hc1; $display("%b", x); // 0000000011000001
3408        //x = 8'hf1 & 8'he2; $display("%b", x); // 0000000011100000
3409        //x = 8'hx1 & 8'hx2; $display("%b", x); // 00000000xxxx0000
3410        //x = 8'hz3 & 8'hz7; $display("%b", x); // 00000000xxxx0011
3411        //x = 8'h13 & 8'hx1; $display("%b", x); // 00000000000x0001
3412        //x = 8'h11 & 8'hz2; $display("%b", x); // 00000000000x0000
3413        //x = 8'hx1 & 8'hzd; $display("%b", x); // 00000000xxxx0001
3414        //x = 8'h1z & 8'hfx; $display("%b", x); // 000000000001xxxx
3415
3416        let op = Op::BitAnd;
3417        let mut cache = MaskCache::default();
3418
3419        let x00 = Value::from_str("8'hf3").unwrap();
3420        let x01 = Value::from_str("8'hf1").unwrap();
3421        let x02 = Value::from_str("8'hx1").unwrap();
3422        let x03 = Value::from_str("8'hz3").unwrap();
3423        let x04 = Value::from_str("8'h13").unwrap();
3424        let x05 = Value::from_str("8'h11").unwrap();
3425        let x06 = Value::from_str("8'hx1").unwrap();
3426        let x07 = Value::from_str("8'h1z").unwrap();
3427        let x10 = Value::from_str("8'hc1").unwrap();
3428        let x11 = Value::from_str("8'he2").unwrap();
3429        let x12 = Value::from_str("8'hx2").unwrap();
3430        let x13 = Value::from_str("8'hz7").unwrap();
3431        let x14 = Value::from_str("8'hx1").unwrap();
3432        let x15 = Value::from_str("8'hz2").unwrap();
3433        let x16 = Value::from_str("8'hzd").unwrap();
3434        let x17 = Value::from_str("8'hfx").unwrap();
3435        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3436        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3437        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3438        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3439        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
3440        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
3441        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
3442        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
3443        assert_eq!(format!("{:b}", x00), "16'b0000000011000001");
3444        assert_eq!(format!("{:b}", x01), "16'b0000000011100000");
3445        assert_eq!(format!("{:b}", x02), "16'b00000000xxxx0000");
3446        assert_eq!(format!("{:b}", x03), "16'b00000000xxxx0011");
3447        assert_eq!(format!("{:b}", x04), "16'b00000000000x0001");
3448        assert_eq!(format!("{:b}", x05), "16'b00000000000x0000");
3449        assert_eq!(format!("{:b}", x06), "16'b00000000xxxx0001");
3450        assert_eq!(format!("{:b}", x07), "16'b000000000001xxxx");
3451
3452        let x00 = Value::from_str("68'hffffffffffffffff3").unwrap();
3453        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
3454        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3455        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz3").unwrap();
3456        let x04 = Value::from_str("68'h11111111111111113").unwrap();
3457        let x05 = Value::from_str("68'h11111111111111111").unwrap();
3458        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3459        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
3460        let x10 = Value::from_str("68'hcccccccccccccccc1").unwrap();
3461        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
3462        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx2").unwrap();
3463        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz7").unwrap();
3464        let x14 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3465        let x15 = Value::from_str("68'hzzzzzzzzzzzzzzzz2").unwrap();
3466        let x16 = Value::from_str("68'hzzzzzzzzzzzzzzzzd").unwrap();
3467        let x17 = Value::from_str("68'hffffffffffffffffx").unwrap();
3468        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3469        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3470        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3471        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3472        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
3473        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
3474        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
3475        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
3476        assert_eq!(format!("{:x}", x00), "68'hcccccccccccccccc1");
3477        assert_eq!(format!("{:x}", x01), "68'heeeeeeeeeeeeeeee0");
3478        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxx0");
3479        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxx3");
3480        assert_eq!(format!("{:x}", x04), "68'hXXXXXXXXXXXXXXXX1");
3481        assert_eq!(format!("{:x}", x05), "68'hXXXXXXXXXXXXXXXX0");
3482        assert_eq!(format!("{:x}", x06), "68'hxxxxxxxxxxxxxxxx1");
3483        assert_eq!(format!("{:x}", x07), "68'h1111111111111111x");
3484    }
3485
3486    #[test]
3487    fn binary_bit_or() {
3488        //x = 8'hf3 | 8'hc1; $display("%b", x); // 0000000011110011
3489        //x = 8'hf1 | 8'he2; $display("%b", x); // 0000000011110011
3490        //x = 8'hx1 | 8'hx2; $display("%b", x); // 00000000xxxx0011
3491        //x = 8'hz3 | 8'hz7; $display("%b", x); // 00000000xxxx0111
3492        //x = 8'h13 | 8'hx1; $display("%b", x); // 00000000xxx10011
3493        //x = 8'h11 | 8'hz2; $display("%b", x); // 00000000xxx10011
3494        //x = 8'hx1 | 8'hzd; $display("%b", x); // 00000000xxxx1101
3495        //x = 8'h1z | 8'hfx; $display("%b", x); // 000000001111xxxx
3496
3497        let op = Op::BitOr;
3498        let mut cache = MaskCache::default();
3499
3500        let x00 = Value::from_str("8'hf3").unwrap();
3501        let x01 = Value::from_str("8'hf1").unwrap();
3502        let x02 = Value::from_str("8'hx1").unwrap();
3503        let x03 = Value::from_str("8'hz3").unwrap();
3504        let x04 = Value::from_str("8'h13").unwrap();
3505        let x05 = Value::from_str("8'h11").unwrap();
3506        let x06 = Value::from_str("8'hx1").unwrap();
3507        let x07 = Value::from_str("8'h1z").unwrap();
3508        let x10 = Value::from_str("8'hc1").unwrap();
3509        let x11 = Value::from_str("8'he2").unwrap();
3510        let x12 = Value::from_str("8'hx2").unwrap();
3511        let x13 = Value::from_str("8'hz7").unwrap();
3512        let x14 = Value::from_str("8'hx1").unwrap();
3513        let x15 = Value::from_str("8'hz2").unwrap();
3514        let x16 = Value::from_str("8'hzd").unwrap();
3515        let x17 = Value::from_str("8'hfx").unwrap();
3516        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3517        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3518        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3519        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3520        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
3521        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
3522        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
3523        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
3524        assert_eq!(format!("{:b}", x00), "16'b0000000011110011");
3525        assert_eq!(format!("{:b}", x01), "16'b0000000011110011");
3526        assert_eq!(format!("{:b}", x02), "16'b00000000xxxx0011");
3527        assert_eq!(format!("{:b}", x03), "16'b00000000xxxx0111");
3528        assert_eq!(format!("{:b}", x04), "16'b00000000xxx10011");
3529        assert_eq!(format!("{:b}", x05), "16'b00000000xxx10011");
3530        assert_eq!(format!("{:b}", x06), "16'b00000000xxxx1101");
3531        assert_eq!(format!("{:b}", x07), "16'b000000001111xxxx");
3532
3533        let x00 = Value::from_str("68'hffffffffffffffff3").unwrap();
3534        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
3535        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3536        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz3").unwrap();
3537        let x04 = Value::from_str("68'h11111111111111113").unwrap();
3538        let x05 = Value::from_str("68'h11111111111111111").unwrap();
3539        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3540        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
3541        let x10 = Value::from_str("68'hcccccccccccccccc1").unwrap();
3542        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
3543        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx2").unwrap();
3544        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz7").unwrap();
3545        let x14 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3546        let x15 = Value::from_str("68'hzzzzzzzzzzzzzzzz2").unwrap();
3547        let x16 = Value::from_str("68'hzzzzzzzzzzzzzzzzd").unwrap();
3548        let x17 = Value::from_str("68'hffffffffffffffffx").unwrap();
3549        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3550        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3551        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3552        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3553        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
3554        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
3555        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
3556        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
3557        assert_eq!(format!("{:x}", x00), "68'hffffffffffffffff3");
3558        assert_eq!(format!("{:x}", x01), "68'hffffffffffffffff3");
3559        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxx3");
3560        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxx7");
3561        assert_eq!(format!("{:x}", x04), "68'hXXXXXXXXXXXXXXXX3");
3562        assert_eq!(format!("{:x}", x05), "68'hXXXXXXXXXXXXXXXX3");
3563        assert_eq!(format!("{:x}", x06), "68'hxxxxxxxxxxxxxxxxd");
3564        assert_eq!(format!("{:x}", x07), "68'hffffffffffffffffx");
3565    }
3566
3567    #[test]
3568    fn binary_bit_xor() {
3569        //x = 8'hf3 ^ 8'hc1; $display("%b", x); // 0000000000110010
3570        //x = 8'hf1 ^ 8'he2; $display("%b", x); // 0000000000010011
3571        //x = 8'hx1 ^ 8'hx2; $display("%b", x); // 00000000xxxx0011
3572        //x = 8'hz3 ^ 8'hz7; $display("%b", x); // 00000000xxxx0100
3573        //x = 8'h13 ^ 8'hx1; $display("%b", x); // 00000000xxxx0010
3574        //x = 8'h11 ^ 8'hz2; $display("%b", x); // 00000000xxxx0011
3575        //x = 8'hx1 ^ 8'hzd; $display("%b", x); // 00000000xxxx1100
3576        //x = 8'h1z ^ 8'hfx; $display("%b", x); // 000000001110xxxx
3577
3578        let op = Op::BitXor;
3579        let mut cache = MaskCache::default();
3580
3581        let x00 = Value::from_str("8'hf3").unwrap();
3582        let x01 = Value::from_str("8'hf1").unwrap();
3583        let x02 = Value::from_str("8'hx1").unwrap();
3584        let x03 = Value::from_str("8'hz3").unwrap();
3585        let x04 = Value::from_str("8'h13").unwrap();
3586        let x05 = Value::from_str("8'h11").unwrap();
3587        let x06 = Value::from_str("8'hx1").unwrap();
3588        let x07 = Value::from_str("8'h1z").unwrap();
3589        let x10 = Value::from_str("8'hc1").unwrap();
3590        let x11 = Value::from_str("8'he2").unwrap();
3591        let x12 = Value::from_str("8'hx2").unwrap();
3592        let x13 = Value::from_str("8'hz7").unwrap();
3593        let x14 = Value::from_str("8'hx1").unwrap();
3594        let x15 = Value::from_str("8'hz2").unwrap();
3595        let x16 = Value::from_str("8'hzd").unwrap();
3596        let x17 = Value::from_str("8'hfx").unwrap();
3597        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3598        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3599        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3600        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3601        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
3602        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
3603        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
3604        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
3605        assert_eq!(format!("{:b}", x00), "16'b0000000000110010");
3606        assert_eq!(format!("{:b}", x01), "16'b0000000000010011");
3607        assert_eq!(format!("{:b}", x02), "16'b00000000xxxx0011");
3608        assert_eq!(format!("{:b}", x03), "16'b00000000xxxx0100");
3609        assert_eq!(format!("{:b}", x04), "16'b00000000xxxx0010");
3610        assert_eq!(format!("{:b}", x05), "16'b00000000xxxx0011");
3611        assert_eq!(format!("{:b}", x06), "16'b00000000xxxx1100");
3612        assert_eq!(format!("{:b}", x07), "16'b000000001110xxxx");
3613
3614        let x00 = Value::from_str("68'hffffffffffffffff3").unwrap();
3615        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
3616        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3617        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz3").unwrap();
3618        let x04 = Value::from_str("68'h11111111111111113").unwrap();
3619        let x05 = Value::from_str("68'h11111111111111111").unwrap();
3620        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3621        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
3622        let x10 = Value::from_str("68'hcccccccccccccccc1").unwrap();
3623        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
3624        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx2").unwrap();
3625        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz7").unwrap();
3626        let x14 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3627        let x15 = Value::from_str("68'hzzzzzzzzzzzzzzzz2").unwrap();
3628        let x16 = Value::from_str("68'hzzzzzzzzzzzzzzzzd").unwrap();
3629        let x17 = Value::from_str("68'hffffffffffffffffx").unwrap();
3630        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3631        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3632        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3633        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3634        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
3635        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
3636        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
3637        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
3638        assert_eq!(format!("{:x}", x00), "68'h33333333333333332");
3639        assert_eq!(format!("{:x}", x01), "68'h11111111111111113");
3640        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxx3");
3641        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxx4");
3642        assert_eq!(format!("{:x}", x04), "68'hxxxxxxxxxxxxxxxx2");
3643        assert_eq!(format!("{:x}", x05), "68'hxxxxxxxxxxxxxxxx3");
3644        assert_eq!(format!("{:x}", x06), "68'hxxxxxxxxxxxxxxxxc");
3645        assert_eq!(format!("{:x}", x07), "68'heeeeeeeeeeeeeeeex");
3646    }
3647
3648    #[test]
3649    fn binary_bit_xnor() {
3650        //x = 8'hf3 ~^ 8'hc1; $display("%b", x); // 1111111111001101
3651        //x = 8'hf1 ~^ 8'he2; $display("%b", x); // 1111111111101100
3652        //x = 8'hx1 ~^ 8'hx2; $display("%b", x); // 11111111xxxx1100
3653        //x = 8'hz3 ~^ 8'hz7; $display("%b", x); // 11111111xxxx1011
3654        //x = 8'h13 ~^ 8'hx1; $display("%b", x); // 11111111xxxx1101
3655        //x = 8'h11 ~^ 8'hz2; $display("%b", x); // 11111111xxxx1100
3656        //x = 8'hx1 ~^ 8'hzd; $display("%b", x); // 11111111xxxx0011
3657        //x = 8'h1z ~^ 8'hfx; $display("%b", x); // 111111110001xxxx
3658
3659        let op = Op::BitXnor;
3660        let mut cache = MaskCache::default();
3661
3662        let x00 = Value::from_str("8'hf3").unwrap();
3663        let x01 = Value::from_str("8'hf1").unwrap();
3664        let x02 = Value::from_str("8'hx1").unwrap();
3665        let x03 = Value::from_str("8'hz3").unwrap();
3666        let x04 = Value::from_str("8'h13").unwrap();
3667        let x05 = Value::from_str("8'h11").unwrap();
3668        let x06 = Value::from_str("8'hx1").unwrap();
3669        let x07 = Value::from_str("8'h1z").unwrap();
3670        let x10 = Value::from_str("8'hc1").unwrap();
3671        let x11 = Value::from_str("8'he2").unwrap();
3672        let x12 = Value::from_str("8'hx2").unwrap();
3673        let x13 = Value::from_str("8'hz7").unwrap();
3674        let x14 = Value::from_str("8'hx1").unwrap();
3675        let x15 = Value::from_str("8'hz2").unwrap();
3676        let x16 = Value::from_str("8'hzd").unwrap();
3677        let x17 = Value::from_str("8'hfx").unwrap();
3678        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3679        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3680        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3681        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3682        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
3683        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
3684        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
3685        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
3686        assert_eq!(format!("{:b}", x00), "16'b1111111111001101");
3687        assert_eq!(format!("{:b}", x01), "16'b1111111111101100");
3688        assert_eq!(format!("{:b}", x02), "16'b11111111xxxx1100");
3689        assert_eq!(format!("{:b}", x03), "16'b11111111xxxx1011");
3690        assert_eq!(format!("{:b}", x04), "16'b11111111xxxx1101");
3691        assert_eq!(format!("{:b}", x05), "16'b11111111xxxx1100");
3692        assert_eq!(format!("{:b}", x06), "16'b11111111xxxx0011");
3693        assert_eq!(format!("{:b}", x07), "16'b111111110001xxxx");
3694
3695        let x00 = Value::from_str("68'hffffffffffffffff3").unwrap();
3696        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
3697        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3698        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz3").unwrap();
3699        let x04 = Value::from_str("68'h11111111111111113").unwrap();
3700        let x05 = Value::from_str("68'h11111111111111111").unwrap();
3701        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3702        let x07 = Value::from_str("68'h1111111111111111z").unwrap();
3703        let x10 = Value::from_str("68'hcccccccccccccccc1").unwrap();
3704        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
3705        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx2").unwrap();
3706        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz7").unwrap();
3707        let x14 = Value::from_str("68'hxxxxxxxxxxxxxxxx1").unwrap();
3708        let x15 = Value::from_str("68'hzzzzzzzzzzzzzzzz2").unwrap();
3709        let x16 = Value::from_str("68'hzzzzzzzzzzzzzzzzd").unwrap();
3710        let x17 = Value::from_str("68'hffffffffffffffffx").unwrap();
3711        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3712        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3713        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3714        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3715        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
3716        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
3717        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
3718        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
3719        assert_eq!(format!("{:x}", x00), "68'hccccccccccccccccd");
3720        assert_eq!(format!("{:x}", x01), "68'heeeeeeeeeeeeeeeec");
3721        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxc");
3722        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxb");
3723        assert_eq!(format!("{:x}", x04), "68'hxxxxxxxxxxxxxxxxd");
3724        assert_eq!(format!("{:x}", x05), "68'hxxxxxxxxxxxxxxxxc");
3725        assert_eq!(format!("{:x}", x06), "68'hxxxxxxxxxxxxxxxx3");
3726        assert_eq!(format!("{:x}", x07), "68'h1111111111111111x");
3727    }
3728
3729    #[test]
3730    fn binary_eq() {
3731        //x = 8'h00 == 8'h00; $display("%b", x); // 0000000000000001
3732        //x = 8'hf1 == 8'he2; $display("%b", x); // 0000000000000000
3733        //x = 8'hx0 == 8'hx0; $display("%b", x); // 000000000000000x
3734        //x = 8'hx3 == 8'hx7; $display("%b", x); // 0000000000000000
3735        //x = 8'hz0 == 8'hz0; $display("%b", x); // 000000000000000x
3736        //x = 8'hz1 == 8'hz2; $display("%b", x); // 0000000000000000
3737        //x = 8'hxz == 8'hxz; $display("%b", x); // 000000000000000x
3738        //x = 8'hzx == 8'hxz; $display("%b", x); // 000000000000000x
3739
3740        let op = Op::Eq;
3741        let mut cache = MaskCache::default();
3742
3743        let x00 = Value::from_str("8'h00").unwrap();
3744        let x01 = Value::from_str("8'hf1").unwrap();
3745        let x02 = Value::from_str("8'hx0").unwrap();
3746        let x03 = Value::from_str("8'hx3").unwrap();
3747        let x04 = Value::from_str("8'hz0").unwrap();
3748        let x05 = Value::from_str("8'hz1").unwrap();
3749        let x06 = Value::from_str("8'hxz").unwrap();
3750        let x07 = Value::from_str("8'hzx").unwrap();
3751        let x10 = Value::from_str("8'h00").unwrap();
3752        let x11 = Value::from_str("8'he2").unwrap();
3753        let x12 = Value::from_str("8'hx0").unwrap();
3754        let x13 = Value::from_str("8'hx7").unwrap();
3755        let x14 = Value::from_str("8'hz0").unwrap();
3756        let x15 = Value::from_str("8'hz2").unwrap();
3757        let x16 = Value::from_str("8'hxz").unwrap();
3758        let x17 = Value::from_str("8'hxz").unwrap();
3759        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3760        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3761        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3762        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3763        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
3764        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
3765        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
3766        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
3767        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
3768        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
3769        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
3770        assert_eq!(format!("{:b}", x03), "16'b0000000000000000");
3771        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
3772        assert_eq!(format!("{:b}", x05), "16'b0000000000000000");
3773        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
3774        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
3775
3776        let x00 = Value::from_str("68'h00000000000000000").unwrap();
3777        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
3778        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
3779        let x03 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
3780        let x04 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
3781        let x05 = Value::from_str("68'hzzzzzzzzzzzzzzzz1").unwrap();
3782        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3783        let x07 = Value::from_str("68'hzzzzzzzzzzzzzzzzx").unwrap();
3784        let x10 = Value::from_str("68'h00000000000000000").unwrap();
3785        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
3786        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
3787        let x13 = Value::from_str("68'hxxxxxxxxxxxxxxxx7").unwrap();
3788        let x14 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
3789        let x15 = Value::from_str("68'hzzzzzzzzzzzzzzzz2").unwrap();
3790        let x16 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3791        let x17 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3792        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3793        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3794        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3795        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3796        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
3797        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
3798        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
3799        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
3800        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
3801        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
3802        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
3803        assert_eq!(format!("{:x}", x03), "68'h00000000000000000");
3804        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
3805        assert_eq!(format!("{:x}", x05), "68'h00000000000000000");
3806        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
3807        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
3808    }
3809
3810    #[test]
3811    fn binary_ne() {
3812        //x = 8'h00 != 8'h00; $display("%b", x); // 0000000000000000
3813        //x = 8'hf1 != 8'he2; $display("%b", x); // 0000000000000001
3814        //x = 8'hx0 != 8'hx0; $display("%b", x); // 000000000000000x
3815        //x = 8'hx3 != 8'hx7; $display("%b", x); // 0000000000000001
3816        //x = 8'hz0 != 8'hz0; $display("%b", x); // 000000000000000x
3817        //x = 8'hz1 != 8'hz2; $display("%b", x); // 0000000000000001
3818        //x = 8'hxz != 8'hxz; $display("%b", x); // 000000000000000x
3819        //x = 8'hzx != 8'hxz; $display("%b", x); // 000000000000000x
3820
3821        let op = Op::Ne;
3822        let mut cache = MaskCache::default();
3823
3824        let x00 = Value::from_str("8'h00").unwrap();
3825        let x01 = Value::from_str("8'hf1").unwrap();
3826        let x02 = Value::from_str("8'hx0").unwrap();
3827        let x03 = Value::from_str("8'hx3").unwrap();
3828        let x04 = Value::from_str("8'hz0").unwrap();
3829        let x05 = Value::from_str("8'hz1").unwrap();
3830        let x06 = Value::from_str("8'hxz").unwrap();
3831        let x07 = Value::from_str("8'hzx").unwrap();
3832        let x10 = Value::from_str("8'h00").unwrap();
3833        let x11 = Value::from_str("8'he2").unwrap();
3834        let x12 = Value::from_str("8'hx0").unwrap();
3835        let x13 = Value::from_str("8'hx7").unwrap();
3836        let x14 = Value::from_str("8'hz0").unwrap();
3837        let x15 = Value::from_str("8'hz2").unwrap();
3838        let x16 = Value::from_str("8'hxz").unwrap();
3839        let x17 = Value::from_str("8'hxz").unwrap();
3840        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3841        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3842        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3843        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3844        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
3845        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
3846        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
3847        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
3848        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
3849        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
3850        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
3851        assert_eq!(format!("{:b}", x03), "16'b0000000000000001");
3852        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
3853        assert_eq!(format!("{:b}", x05), "16'b0000000000000001");
3854        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
3855        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
3856
3857        let x00 = Value::from_str("68'h00000000000000000").unwrap();
3858        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
3859        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
3860        let x03 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
3861        let x04 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
3862        let x05 = Value::from_str("68'hzzzzzzzzzzzzzzzz1").unwrap();
3863        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3864        let x07 = Value::from_str("68'hzzzzzzzzzzzzzzzzx").unwrap();
3865        let x10 = Value::from_str("68'h00000000000000000").unwrap();
3866        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
3867        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
3868        let x13 = Value::from_str("68'hxxxxxxxxxxxxxxxx7").unwrap();
3869        let x14 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
3870        let x15 = Value::from_str("68'hzzzzzzzzzzzzzzzz2").unwrap();
3871        let x16 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3872        let x17 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3873        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3874        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3875        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3876        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3877        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
3878        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
3879        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
3880        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
3881        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
3882        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
3883        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
3884        assert_eq!(format!("{:x}", x03), "68'h00000000000000001");
3885        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
3886        assert_eq!(format!("{:x}", x05), "68'h00000000000000001");
3887        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
3888        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
3889    }
3890
3891    #[test]
3892    fn binary_eq_wildcard() {
3893        //x = 8'h00 ==? 8'h00; $display("%b", x); // 0000000000000001
3894        //x = 8'hf1 ==? 8'he2; $display("%b", x); // 0000000000000000
3895        //x = 8'hx0 ==? 8'h30; $display("%b", x); // 000000000000000x
3896        //x = 8'h43 ==? 8'h4x; $display("%b", x); // 0000000000000001
3897        //x = 8'hz0 ==? 8'h30; $display("%b", x); // 000000000000000x
3898        //x = 8'h11 ==? 8'h1z; $display("%b", x); // 0000000000000001
3899        //x = 8'hxz ==? 8'hxz; $display("%b", x); // 0000000000000001
3900        //x = 8'hzx ==? 8'hxz; $display("%b", x); // 0000000000000001
3901        //x = 8'hx3 ==? 8'h30; $display("%b", x); // 0000000000000000
3902        //x = 8'hx5 ==? 8'h36; $display("%b", x); // 0000000000000000
3903
3904        let op = Op::EqWildcard;
3905        let mut cache = MaskCache::default();
3906
3907        let x00 = Value::from_str("8'h00").unwrap();
3908        let x01 = Value::from_str("8'hf1").unwrap();
3909        let x02 = Value::from_str("8'hx0").unwrap();
3910        let x03 = Value::from_str("8'h43").unwrap();
3911        let x04 = Value::from_str("8'hz0").unwrap();
3912        let x05 = Value::from_str("8'h11").unwrap();
3913        let x06 = Value::from_str("8'hxz").unwrap();
3914        let x07 = Value::from_str("8'hzx").unwrap();
3915        let x08 = Value::from_str("8'hx3").unwrap();
3916        let x09 = Value::from_str("8'hx5").unwrap();
3917        let x10 = Value::from_str("8'h00").unwrap();
3918        let x11 = Value::from_str("8'he2").unwrap();
3919        let x12 = Value::from_str("8'h30").unwrap();
3920        let x13 = Value::from_str("8'h4x").unwrap();
3921        let x14 = Value::from_str("8'h30").unwrap();
3922        let x15 = Value::from_str("8'h1z").unwrap();
3923        let x16 = Value::from_str("8'hxz").unwrap();
3924        let x17 = Value::from_str("8'hxz").unwrap();
3925        let x18 = Value::from_str("8'h30").unwrap();
3926        let x19 = Value::from_str("8'h36").unwrap();
3927        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
3928        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
3929        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
3930        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
3931        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
3932        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
3933        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
3934        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
3935        let x08 = op.eval_value_binary(&x08, &x18, 16, false, &mut cache);
3936        let x09 = op.eval_value_binary(&x09, &x19, 16, false, &mut cache);
3937        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
3938        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
3939        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
3940        assert_eq!(format!("{:b}", x03), "16'b0000000000000001");
3941        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
3942        assert_eq!(format!("{:b}", x05), "16'b0000000000000001");
3943        assert_eq!(format!("{:b}", x06), "16'b0000000000000001");
3944        assert_eq!(format!("{:b}", x07), "16'b0000000000000001");
3945        assert_eq!(format!("{:b}", x08), "16'b0000000000000000");
3946        assert_eq!(format!("{:b}", x09), "16'b0000000000000000");
3947
3948        let x00 = Value::from_str("68'h00000000000000000").unwrap();
3949        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
3950        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
3951        let x03 = Value::from_str("68'h44444444444444443").unwrap();
3952        let x04 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
3953        let x05 = Value::from_str("68'h11111111111111111").unwrap();
3954        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3955        let x07 = Value::from_str("68'hzzzzzzzzzzzzzzzzx").unwrap();
3956        let x08 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
3957        let x10 = Value::from_str("68'h00000000000000000").unwrap();
3958        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
3959        let x12 = Value::from_str("68'h33333333333333330").unwrap();
3960        let x13 = Value::from_str("68'h4444444444444444x").unwrap();
3961        let x14 = Value::from_str("68'h33333333333333330").unwrap();
3962        let x15 = Value::from_str("68'h1111111111111111z").unwrap();
3963        let x16 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3964        let x17 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
3965        let x18 = Value::from_str("68'h33333333333333330").unwrap();
3966        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
3967        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
3968        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
3969        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
3970        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
3971        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
3972        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
3973        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
3974        let x08 = op.eval_value_binary(&x08, &x18, 68, false, &mut cache);
3975        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
3976        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
3977        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
3978        assert_eq!(format!("{:x}", x03), "68'h00000000000000001");
3979        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
3980        assert_eq!(format!("{:x}", x05), "68'h00000000000000001");
3981        assert_eq!(format!("{:x}", x06), "68'h00000000000000001");
3982        assert_eq!(format!("{:x}", x07), "68'h00000000000000001");
3983        assert_eq!(format!("{:x}", x08), "68'h00000000000000000");
3984    }
3985
3986    #[test]
3987    fn binary_ne_wildcard() {
3988        //x = 8'h00 !=? 8'h00; $display("%b", x); // 0000000000000000
3989        //x = 8'hf1 !=? 8'he2; $display("%b", x); // 0000000000000001
3990        //x = 8'hx0 !=? 8'h30; $display("%b", x); // 000000000000000x
3991        //x = 8'h43 !=? 8'h4x; $display("%b", x); // 0000000000000000
3992        //x = 8'hz0 !=? 8'h30; $display("%b", x); // 000000000000000x
3993        //x = 8'h11 !=? 8'h1z; $display("%b", x); // 0000000000000000
3994        //x = 8'hxz !=? 8'hxz; $display("%b", x); // 0000000000000000
3995        //x = 8'hzx !=? 8'hxz; $display("%b", x); // 0000000000000000
3996        //x = 8'hx3 !=? 8'h30; $display("%b", x); // 0000000000000001
3997        //x = 8'hx5 !=? 8'h36; $display("%b", x); // 0000000000000001
3998
3999        let op = Op::NeWildcard;
4000        let mut cache = MaskCache::default();
4001
4002        let x00 = Value::from_str("8'h00").unwrap();
4003        let x01 = Value::from_str("8'hf1").unwrap();
4004        let x02 = Value::from_str("8'hx0").unwrap();
4005        let x03 = Value::from_str("8'h43").unwrap();
4006        let x04 = Value::from_str("8'hz0").unwrap();
4007        let x05 = Value::from_str("8'h11").unwrap();
4008        let x06 = Value::from_str("8'hxz").unwrap();
4009        let x07 = Value::from_str("8'hzx").unwrap();
4010        let x08 = Value::from_str("8'hx3").unwrap();
4011        let x09 = Value::from_str("8'hx5").unwrap();
4012        let x10 = Value::from_str("8'h00").unwrap();
4013        let x11 = Value::from_str("8'he2").unwrap();
4014        let x12 = Value::from_str("8'h30").unwrap();
4015        let x13 = Value::from_str("8'h4x").unwrap();
4016        let x14 = Value::from_str("8'h30").unwrap();
4017        let x15 = Value::from_str("8'h1z").unwrap();
4018        let x16 = Value::from_str("8'hxz").unwrap();
4019        let x17 = Value::from_str("8'hxz").unwrap();
4020        let x18 = Value::from_str("8'h30").unwrap();
4021        let x19 = Value::from_str("8'h36").unwrap();
4022        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4023        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4024        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4025        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4026        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
4027        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
4028        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
4029        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
4030        let x08 = op.eval_value_binary(&x08, &x18, 16, false, &mut cache);
4031        let x09 = op.eval_value_binary(&x09, &x19, 16, false, &mut cache);
4032        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
4033        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
4034        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
4035        assert_eq!(format!("{:b}", x03), "16'b0000000000000000");
4036        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
4037        assert_eq!(format!("{:b}", x05), "16'b0000000000000000");
4038        assert_eq!(format!("{:b}", x06), "16'b0000000000000000");
4039        assert_eq!(format!("{:b}", x07), "16'b0000000000000000");
4040        assert_eq!(format!("{:b}", x08), "16'b0000000000000001");
4041        assert_eq!(format!("{:b}", x09), "16'b0000000000000001");
4042
4043        let x00 = Value::from_str("68'h00000000000000000").unwrap();
4044        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4045        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
4046        let x03 = Value::from_str("68'h44444444444444443").unwrap();
4047        let x04 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
4048        let x05 = Value::from_str("68'h11111111111111111").unwrap();
4049        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
4050        let x07 = Value::from_str("68'hzzzzzzzzzzzzzzzzx").unwrap();
4051        let x08 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4052        let x09 = Value::from_str("68'hxxxxxxxxxxxxxxxx5").unwrap();
4053        let x10 = Value::from_str("68'h00000000000000000").unwrap();
4054        let x11 = Value::from_str("68'heeeeeeeeeeeeeeee2").unwrap();
4055        let x12 = Value::from_str("68'h33333333333333330").unwrap();
4056        let x13 = Value::from_str("68'h4444444444444444x").unwrap();
4057        let x14 = Value::from_str("68'h33333333333333330").unwrap();
4058        let x15 = Value::from_str("68'h1111111111111111z").unwrap();
4059        let x16 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
4060        let x17 = Value::from_str("68'hxxxxxxxxxxxxxxxxz").unwrap();
4061        let x18 = Value::from_str("68'h33333333333333330").unwrap();
4062        let x19 = Value::from_str("68'h33333333333333336").unwrap();
4063        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4064        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4065        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4066        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4067        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
4068        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
4069        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
4070        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
4071        let x08 = op.eval_value_binary(&x08, &x18, 68, false, &mut cache);
4072        let x09 = op.eval_value_binary(&x09, &x19, 68, false, &mut cache);
4073        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
4074        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
4075        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
4076        assert_eq!(format!("{:x}", x03), "68'h00000000000000000");
4077        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
4078        assert_eq!(format!("{:x}", x05), "68'h00000000000000000");
4079        assert_eq!(format!("{:x}", x06), "68'h00000000000000000");
4080        assert_eq!(format!("{:x}", x07), "68'h00000000000000000");
4081        assert_eq!(format!("{:x}", x08), "68'h00000000000000001");
4082        assert_eq!(format!("{:x}", x09), "68'h00000000000000001");
4083    }
4084
4085    #[test]
4086    fn binary_greater() {
4087        //x = 8'h03  > 8'h01 ; $display("%b", x); // 0000000000000001
4088        //x = 8'hf1  > 8'h02 ; $display("%b", x); // 0000000000000001
4089        //x = 8'hx3  > 8'hx3 ; $display("%b", x); // 000000000000000x
4090        //x = 8'hz4  > 8'hz4 ; $display("%b", x); // 000000000000000x
4091        //x = 8'sh03 > 8'sh01; $display("%b", x); // 0000000000000001
4092        //x = 8'shf1 > 8'sh02; $display("%b", x); // 0000000000000000
4093        //x = 8'shx3 > 8'shx3; $display("%b", x); // 000000000000000x
4094        //x = 8'shz4 > 8'shz4; $display("%b", x); // 000000000000000x
4095
4096        let op = Op::Greater;
4097        let mut cache = MaskCache::default();
4098
4099        let x00 = Value::from_str("8'h03").unwrap();
4100        let x01 = Value::from_str("8'hf1").unwrap();
4101        let x02 = Value::from_str("8'hx3").unwrap();
4102        let x03 = Value::from_str("8'hz4").unwrap();
4103        let x04 = Value::from_str("8'sh03").unwrap();
4104        let x05 = Value::from_str("8'shf1").unwrap();
4105        let x06 = Value::from_str("8'shx3").unwrap();
4106        let x07 = Value::from_str("8'shz4").unwrap();
4107        let x10 = Value::from_str("8'h01").unwrap();
4108        let x11 = Value::from_str("8'h02").unwrap();
4109        let x12 = Value::from_str("8'hx3").unwrap();
4110        let x13 = Value::from_str("8'hz4").unwrap();
4111        let x14 = Value::from_str("8'sh01").unwrap();
4112        let x15 = Value::from_str("8'sh02").unwrap();
4113        let x16 = Value::from_str("8'shx3").unwrap();
4114        let x17 = Value::from_str("8'shz4").unwrap();
4115        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4116        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4117        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4118        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4119        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4120        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4121        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4122        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4123        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
4124        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
4125        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
4126        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
4127        assert_eq!(format!("{:b}", x04), "16'b0000000000000001");
4128        assert_eq!(format!("{:b}", x05), "16'b0000000000000000");
4129        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
4130        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
4131
4132        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4133        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4134        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4135        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4136        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4137        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4138        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4139        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4140        let x10 = Value::from_str("68'h00000000000000001").unwrap();
4141        let x11 = Value::from_str("68'h00000000000000002").unwrap();
4142        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4143        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4144        let x14 = Value::from_str("68'sh00000000000000001").unwrap();
4145        let x15 = Value::from_str("68'sh00000000000000002").unwrap();
4146        let x16 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4147        let x17 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4148        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4149        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4150        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4151        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4152        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4153        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4154        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4155        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4156        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
4157        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
4158        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
4159        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
4160        assert_eq!(format!("{:x}", x04), "68'h00000000000000001");
4161        assert_eq!(format!("{:x}", x05), "68'h00000000000000000");
4162        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
4163        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
4164    }
4165
4166    #[test]
4167    fn binary_greater_eq() {
4168        //x = 8'h03  >= 8'h01 ; $display("%b", x); // 0000000000000001
4169        //x = 8'hf1  >= 8'h02 ; $display("%b", x); // 0000000000000001
4170        //x = 8'hx3  >= 8'hx3 ; $display("%b", x); // 000000000000000x
4171        //x = 8'hz4  >= 8'hz4 ; $display("%b", x); // 000000000000000x
4172        //x = 8'sh03 >= 8'sh01; $display("%b", x); // 0000000000000001
4173        //x = 8'shf1 >= 8'sh02; $display("%b", x); // 0000000000000000
4174        //x = 8'shx3 >= 8'shx3; $display("%b", x); // 000000000000000x
4175        //x = 8'shz4 >= 8'shz4; $display("%b", x); // 000000000000000x
4176
4177        let op = Op::GreaterEq;
4178        let mut cache = MaskCache::default();
4179
4180        let x00 = Value::from_str("8'h03").unwrap();
4181        let x01 = Value::from_str("8'hf1").unwrap();
4182        let x02 = Value::from_str("8'hx3").unwrap();
4183        let x03 = Value::from_str("8'hz4").unwrap();
4184        let x04 = Value::from_str("8'sh03").unwrap();
4185        let x05 = Value::from_str("8'shf1").unwrap();
4186        let x06 = Value::from_str("8'shx3").unwrap();
4187        let x07 = Value::from_str("8'shz4").unwrap();
4188        let x10 = Value::from_str("8'h01").unwrap();
4189        let x11 = Value::from_str("8'h02").unwrap();
4190        let x12 = Value::from_str("8'hx3").unwrap();
4191        let x13 = Value::from_str("8'hz4").unwrap();
4192        let x14 = Value::from_str("8'sh01").unwrap();
4193        let x15 = Value::from_str("8'sh02").unwrap();
4194        let x16 = Value::from_str("8'shx3").unwrap();
4195        let x17 = Value::from_str("8'shz4").unwrap();
4196        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4197        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4198        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4199        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4200        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4201        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4202        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4203        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4204        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
4205        assert_eq!(format!("{:b}", x01), "16'b0000000000000001");
4206        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
4207        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
4208        assert_eq!(format!("{:b}", x04), "16'b0000000000000001");
4209        assert_eq!(format!("{:b}", x05), "16'b0000000000000000");
4210        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
4211        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
4212
4213        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4214        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4215        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4216        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4217        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4218        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4219        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4220        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4221        let x10 = Value::from_str("68'h00000000000000001").unwrap();
4222        let x11 = Value::from_str("68'h00000000000000002").unwrap();
4223        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4224        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4225        let x14 = Value::from_str("68'sh00000000000000001").unwrap();
4226        let x15 = Value::from_str("68'sh00000000000000002").unwrap();
4227        let x16 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4228        let x17 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4229        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4230        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4231        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4232        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4233        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4234        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4235        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4236        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4237        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
4238        assert_eq!(format!("{:x}", x01), "68'h00000000000000001");
4239        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
4240        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
4241        assert_eq!(format!("{:x}", x04), "68'h00000000000000001");
4242        assert_eq!(format!("{:x}", x05), "68'h00000000000000000");
4243        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
4244        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
4245    }
4246
4247    #[test]
4248    fn binary_less() {
4249        //x = 8'h03  < 8'h01 ; $display("%b", x); // 0000000000000000
4250        //x = 8'hf1  < 8'h02 ; $display("%b", x); // 0000000000000000
4251        //x = 8'hx3  < 8'hx3 ; $display("%b", x); // 000000000000000x
4252        //x = 8'hz4  < 8'hz4 ; $display("%b", x); // 000000000000000x
4253        //x = 8'sh03 < 8'sh01; $display("%b", x); // 0000000000000000
4254        //x = 8'shf1 < 8'sh02; $display("%b", x); // 0000000000000001
4255        //x = 8'shx3 < 8'shx3; $display("%b", x); // 000000000000000x
4256        //x = 8'shz4 < 8'shz4; $display("%b", x); // 000000000000000x
4257
4258        let op = Op::Less;
4259        let mut cache = MaskCache::default();
4260
4261        let x00 = Value::from_str("8'h03").unwrap();
4262        let x01 = Value::from_str("8'hf1").unwrap();
4263        let x02 = Value::from_str("8'hx3").unwrap();
4264        let x03 = Value::from_str("8'hz4").unwrap();
4265        let x04 = Value::from_str("8'sh03").unwrap();
4266        let x05 = Value::from_str("8'shf1").unwrap();
4267        let x06 = Value::from_str("8'shx3").unwrap();
4268        let x07 = Value::from_str("8'shz4").unwrap();
4269        let x10 = Value::from_str("8'h01").unwrap();
4270        let x11 = Value::from_str("8'h02").unwrap();
4271        let x12 = Value::from_str("8'hx3").unwrap();
4272        let x13 = Value::from_str("8'hz4").unwrap();
4273        let x14 = Value::from_str("8'sh01").unwrap();
4274        let x15 = Value::from_str("8'sh02").unwrap();
4275        let x16 = Value::from_str("8'shx3").unwrap();
4276        let x17 = Value::from_str("8'shz4").unwrap();
4277        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4278        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4279        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4280        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4281        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4282        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4283        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4284        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4285        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
4286        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
4287        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
4288        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
4289        assert_eq!(format!("{:b}", x04), "16'b0000000000000000");
4290        assert_eq!(format!("{:b}", x05), "16'b0000000000000001");
4291        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
4292        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
4293
4294        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4295        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4296        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4297        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4298        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4299        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4300        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4301        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4302        let x10 = Value::from_str("68'h00000000000000001").unwrap();
4303        let x11 = Value::from_str("68'h00000000000000002").unwrap();
4304        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4305        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4306        let x14 = Value::from_str("68'sh00000000000000001").unwrap();
4307        let x15 = Value::from_str("68'sh00000000000000002").unwrap();
4308        let x16 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4309        let x17 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4310        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4311        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4312        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4313        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4314        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4315        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4316        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4317        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4318        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
4319        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
4320        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
4321        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
4322        assert_eq!(format!("{:x}", x04), "68'h00000000000000000");
4323        assert_eq!(format!("{:x}", x05), "68'h00000000000000001");
4324        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
4325        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
4326    }
4327
4328    #[test]
4329    fn binary_less_eq() {
4330        //x = 8'h03  <= 8'h01 ; $display("%b", x); // 0000000000000000
4331        //x = 8'hf1  <= 8'h02 ; $display("%b", x); // 0000000000000000
4332        //x = 8'hx3  <= 8'hx3 ; $display("%b", x); // 000000000000000x
4333        //x = 8'hz4  <= 8'hz4 ; $display("%b", x); // 000000000000000x
4334        //x = 8'sh03 <= 8'sh01; $display("%b", x); // 0000000000000000
4335        //x = 8'shf1 <= 8'sh02; $display("%b", x); // 0000000000000001
4336        //x = 8'shx3 <= 8'shx3; $display("%b", x); // 000000000000000x
4337        //x = 8'shz4 <= 8'shz4; $display("%b", x); // 000000000000000x
4338
4339        let op = Op::LessEq;
4340        let mut cache = MaskCache::default();
4341
4342        let x00 = Value::from_str("8'h03").unwrap();
4343        let x01 = Value::from_str("8'hf1").unwrap();
4344        let x02 = Value::from_str("8'hx3").unwrap();
4345        let x03 = Value::from_str("8'hz4").unwrap();
4346        let x04 = Value::from_str("8'sh03").unwrap();
4347        let x05 = Value::from_str("8'shf1").unwrap();
4348        let x06 = Value::from_str("8'shx3").unwrap();
4349        let x07 = Value::from_str("8'shz4").unwrap();
4350        let x10 = Value::from_str("8'h01").unwrap();
4351        let x11 = Value::from_str("8'h02").unwrap();
4352        let x12 = Value::from_str("8'hx3").unwrap();
4353        let x13 = Value::from_str("8'hz4").unwrap();
4354        let x14 = Value::from_str("8'sh01").unwrap();
4355        let x15 = Value::from_str("8'sh02").unwrap();
4356        let x16 = Value::from_str("8'shx3").unwrap();
4357        let x17 = Value::from_str("8'shz4").unwrap();
4358        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4359        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4360        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4361        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4362        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4363        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4364        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4365        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4366        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
4367        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
4368        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
4369        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
4370        assert_eq!(format!("{:b}", x04), "16'b0000000000000000");
4371        assert_eq!(format!("{:b}", x05), "16'b0000000000000001");
4372        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
4373        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
4374
4375        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4376        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4377        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4378        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4379        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4380        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4381        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4382        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4383        let x10 = Value::from_str("68'h00000000000000001").unwrap();
4384        let x11 = Value::from_str("68'h00000000000000002").unwrap();
4385        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4386        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4387        let x14 = Value::from_str("68'sh00000000000000001").unwrap();
4388        let x15 = Value::from_str("68'sh00000000000000002").unwrap();
4389        let x16 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4390        let x17 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4391        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4392        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4393        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4394        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4395        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4396        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4397        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4398        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4399        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
4400        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
4401        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
4402        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
4403        assert_eq!(format!("{:x}", x04), "68'h00000000000000000");
4404        assert_eq!(format!("{:x}", x05), "68'h00000000000000001");
4405        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
4406        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
4407    }
4408
4409    #[test]
4410    fn binary_logic_and() {
4411        //x = 8'h03 && 8'h01; $display("%b", x); // 0000000000000001
4412        //x = 8'hf1 && 8'h00; $display("%b", x); // 0000000000000000
4413        //x = 8'hx3 && 8'hx3; $display("%b", x); // 0000000000000001
4414        //x = 8'hz4 && 8'hz4; $display("%b", x); // 0000000000000001
4415        //x = 8'h0x && 8'h01; $display("%b", x); // 000000000000000x
4416        //x = 8'hf1 && 8'h0z; $display("%b", x); // 000000000000000x
4417        //x = 8'hxx && 8'hx3; $display("%b", x); // 000000000000000x
4418        //x = 8'hz4 && 8'hzz; $display("%b", x); // 000000000000000x
4419
4420        let op = Op::LogicAnd;
4421        let mut cache = MaskCache::default();
4422
4423        let x00 = Value::from_str("8'h03").unwrap();
4424        let x01 = Value::from_str("8'hf1").unwrap();
4425        let x02 = Value::from_str("8'hx3").unwrap();
4426        let x03 = Value::from_str("8'hz4").unwrap();
4427        let x04 = Value::from_str("8'h0x").unwrap();
4428        let x05 = Value::from_str("8'hf1").unwrap();
4429        let x06 = Value::from_str("8'hxx").unwrap();
4430        let x07 = Value::from_str("8'hz4").unwrap();
4431        let x10 = Value::from_str("8'h01").unwrap();
4432        let x11 = Value::from_str("8'h00").unwrap();
4433        let x12 = Value::from_str("8'hx3").unwrap();
4434        let x13 = Value::from_str("8'hz4").unwrap();
4435        let x14 = Value::from_str("8'h01").unwrap();
4436        let x15 = Value::from_str("8'h0z").unwrap();
4437        let x16 = Value::from_str("8'hx3").unwrap();
4438        let x17 = Value::from_str("8'hzz").unwrap();
4439        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4440        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4441        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4442        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4443        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
4444        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
4445        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
4446        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
4447        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
4448        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
4449        assert_eq!(format!("{:b}", x02), "16'b0000000000000001");
4450        assert_eq!(format!("{:b}", x03), "16'b0000000000000001");
4451        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
4452        assert_eq!(format!("{:b}", x05), "16'b000000000000000x");
4453        assert_eq!(format!("{:b}", x06), "16'b000000000000000x");
4454        assert_eq!(format!("{:b}", x07), "16'b000000000000000x");
4455
4456        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4457        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4458        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4459        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4460        let x04 = Value::from_str("68'h0000000000000000x").unwrap();
4461        let x05 = Value::from_str("68'hffffffffffffffff1").unwrap();
4462        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
4463        let x07 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4464        let x10 = Value::from_str("68'h00000000000000001").unwrap();
4465        let x11 = Value::from_str("68'h00000000000000000").unwrap();
4466        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4467        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4468        let x14 = Value::from_str("68'h00000000000000001").unwrap();
4469        let x15 = Value::from_str("68'h0000000000000000z").unwrap();
4470        let x16 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4471        let x17 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
4472        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4473        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4474        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4475        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4476        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
4477        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
4478        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
4479        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
4480        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
4481        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
4482        assert_eq!(format!("{:x}", x02), "68'h00000000000000001");
4483        assert_eq!(format!("{:x}", x03), "68'h00000000000000001");
4484        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
4485        assert_eq!(format!("{:x}", x05), "68'h0000000000000000X");
4486        assert_eq!(format!("{:x}", x06), "68'h0000000000000000X");
4487        assert_eq!(format!("{:x}", x07), "68'h0000000000000000X");
4488    }
4489
4490    #[test]
4491    fn binary_logic_or() {
4492        //x = 8'h03 || 8'h01; $display("%b", x); // 0000000000000001
4493        //x = 8'h00 || 8'h00; $display("%b", x); // 0000000000000000
4494        //x = 8'hx0 || 8'hx0; $display("%b", x); // 000000000000000x
4495        //x = 8'hz0 || 8'hz0; $display("%b", x); // 000000000000000x
4496        //x = 8'h0x || 8'h0z; $display("%b", x); // 000000000000000x
4497        //x = 8'hf1 || 8'h0z; $display("%b", x); // 0000000000000001
4498        //x = 8'hxx || 8'hx3; $display("%b", x); // 0000000000000001
4499        //x = 8'hz4 || 8'hzz; $display("%b", x); // 0000000000000001
4500
4501        let op = Op::LogicOr;
4502        let mut cache = MaskCache::default();
4503
4504        let x00 = Value::from_str("8'h03").unwrap();
4505        let x01 = Value::from_str("8'h00").unwrap();
4506        let x02 = Value::from_str("8'hx0").unwrap();
4507        let x03 = Value::from_str("8'hz0").unwrap();
4508        let x04 = Value::from_str("8'h0x").unwrap();
4509        let x05 = Value::from_str("8'hf1").unwrap();
4510        let x06 = Value::from_str("8'hxx").unwrap();
4511        let x07 = Value::from_str("8'hz4").unwrap();
4512        let x10 = Value::from_str("8'h01").unwrap();
4513        let x11 = Value::from_str("8'h00").unwrap();
4514        let x12 = Value::from_str("8'hx0").unwrap();
4515        let x13 = Value::from_str("8'hz0").unwrap();
4516        let x14 = Value::from_str("8'h0z").unwrap();
4517        let x15 = Value::from_str("8'h0z").unwrap();
4518        let x16 = Value::from_str("8'hx3").unwrap();
4519        let x17 = Value::from_str("8'hzz").unwrap();
4520        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4521        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4522        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4523        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4524        let x04 = op.eval_value_binary(&x04, &x14, 16, false, &mut cache);
4525        let x05 = op.eval_value_binary(&x05, &x15, 16, false, &mut cache);
4526        let x06 = op.eval_value_binary(&x06, &x16, 16, false, &mut cache);
4527        let x07 = op.eval_value_binary(&x07, &x17, 16, false, &mut cache);
4528        assert_eq!(format!("{:b}", x00), "16'b0000000000000001");
4529        assert_eq!(format!("{:b}", x01), "16'b0000000000000000");
4530        assert_eq!(format!("{:b}", x02), "16'b000000000000000x");
4531        assert_eq!(format!("{:b}", x03), "16'b000000000000000x");
4532        assert_eq!(format!("{:b}", x04), "16'b000000000000000x");
4533        assert_eq!(format!("{:b}", x05), "16'b0000000000000001");
4534        assert_eq!(format!("{:b}", x06), "16'b0000000000000001");
4535        assert_eq!(format!("{:b}", x07), "16'b0000000000000001");
4536
4537        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4538        let x01 = Value::from_str("68'h00000000000000000").unwrap();
4539        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
4540        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
4541        let x04 = Value::from_str("68'h0000000000000000x").unwrap();
4542        let x05 = Value::from_str("68'hffffffffffffffff1").unwrap();
4543        let x06 = Value::from_str("68'hxxxxxxxxxxxxxxxxx").unwrap();
4544        let x07 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4545        let x10 = Value::from_str("68'h00000000000000001").unwrap();
4546        let x11 = Value::from_str("68'h00000000000000000").unwrap();
4547        let x12 = Value::from_str("68'hxxxxxxxxxxxxxxxx0").unwrap();
4548        let x13 = Value::from_str("68'hzzzzzzzzzzzzzzzz0").unwrap();
4549        let x14 = Value::from_str("68'h0000000000000000z").unwrap();
4550        let x15 = Value::from_str("68'h0000000000000000z").unwrap();
4551        let x16 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4552        let x17 = Value::from_str("68'hzzzzzzzzzzzzzzzzz").unwrap();
4553        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4554        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4555        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4556        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4557        let x04 = op.eval_value_binary(&x04, &x14, 68, false, &mut cache);
4558        let x05 = op.eval_value_binary(&x05, &x15, 68, false, &mut cache);
4559        let x06 = op.eval_value_binary(&x06, &x16, 68, false, &mut cache);
4560        let x07 = op.eval_value_binary(&x07, &x17, 68, false, &mut cache);
4561        assert_eq!(format!("{:x}", x00), "68'h00000000000000001");
4562        assert_eq!(format!("{:x}", x01), "68'h00000000000000000");
4563        assert_eq!(format!("{:x}", x02), "68'h0000000000000000X");
4564        assert_eq!(format!("{:x}", x03), "68'h0000000000000000X");
4565        assert_eq!(format!("{:x}", x04), "68'h0000000000000000X");
4566        assert_eq!(format!("{:x}", x05), "68'h00000000000000001");
4567        assert_eq!(format!("{:x}", x06), "68'h00000000000000001");
4568        assert_eq!(format!("{:x}", x07), "68'h00000000000000001");
4569    }
4570
4571    #[test]
4572    fn binary_logic_shift_r() {
4573        //x = 8'h03  >> 2; $display("%b", x); // 0000000000000000
4574        //x = 8'hf1  >> 2; $display("%b", x); // 0000000000111100
4575        //x = 8'hx3  >> 2; $display("%b", x); // 0000000000xxxx00
4576        //x = 8'hz4  >> 2; $display("%b", x); // 0000000000zzzz01
4577        //x = 8'sh03 >> 2; $display("%b", x); // 0000000000000000
4578        //x = 8'shf1 >> 2; $display("%b", x); // 0011111111111100
4579        //x = 8'shx3 >> 2; $display("%b", x); // 00xxxxxxxxxxxx00
4580        //x = 8'shz4 >> 2; $display("%b", x); // 00zzzzzzzzzzzz01
4581
4582        let op = Op::LogicShiftR;
4583        let mut cache = MaskCache::default();
4584
4585        let x00 = Value::from_str("8'h03").unwrap();
4586        let x01 = Value::from_str("8'hf1").unwrap();
4587        let x02 = Value::from_str("8'hx3").unwrap();
4588        let x03 = Value::from_str("8'hz4").unwrap();
4589        let x04 = Value::from_str("8'sh03").unwrap();
4590        let x05 = Value::from_str("8'shf1").unwrap();
4591        let x06 = Value::from_str("8'shx3").unwrap();
4592        let x07 = Value::from_str("8'shz4").unwrap();
4593        let x10 = Value::from_str("2").unwrap();
4594        let x11 = Value::from_str("2").unwrap();
4595        let x12 = Value::from_str("2").unwrap();
4596        let x13 = Value::from_str("2").unwrap();
4597        let x14 = Value::from_str("2").unwrap();
4598        let x15 = Value::from_str("2").unwrap();
4599        let x16 = Value::from_str("2").unwrap();
4600        let x17 = Value::from_str("2").unwrap();
4601        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4602        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4603        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4604        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4605        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4606        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4607        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4608        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4609        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
4610        assert_eq!(format!("{:b}", x01), "16'b0000000000111100");
4611        assert_eq!(format!("{:b}", x02), "16'b0000000000xxxx00");
4612        assert_eq!(format!("{:b}", x03), "16'b0000000000zzzz01");
4613        assert_eq!(format!("{:b}", x04), "16'b0000000000000000");
4614        assert_eq!(format!("{:b}", x05), "16'b0011111111111100");
4615        assert_eq!(format!("{:b}", x06), "16'b00xxxxxxxxxxxx00");
4616        assert_eq!(format!("{:b}", x07), "16'b00zzzzzzzzzzzz01");
4617
4618        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4619        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4620        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4621        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4622        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4623        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4624        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4625        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4626        let x10 = Value::from_str("2").unwrap();
4627        let x11 = Value::from_str("2").unwrap();
4628        let x12 = Value::from_str("2").unwrap();
4629        let x13 = Value::from_str("2").unwrap();
4630        let x14 = Value::from_str("2").unwrap();
4631        let x15 = Value::from_str("2").unwrap();
4632        let x16 = Value::from_str("2").unwrap();
4633        let x17 = Value::from_str("2").unwrap();
4634        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4635        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4636        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4637        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4638        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4639        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4640        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4641        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4642        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
4643        assert_eq!(format!("{:x}", x01), "68'h3fffffffffffffffc");
4644        assert_eq!(format!("{:x}", x02), "68'hXxxxxxxxxxxxxxxxX");
4645        assert_eq!(format!("{:x}", x03), "68'hZzzzzzzzzzzzzzzzZ");
4646        assert_eq!(format!("{:x}", x04), "68'h00000000000000000");
4647        assert_eq!(format!("{:x}", x05), "68'h3fffffffffffffffc");
4648        assert_eq!(format!("{:x}", x06), "68'hXxxxxxxxxxxxxxxxX");
4649        assert_eq!(format!("{:x}", x07), "68'hZzzzzzzzzzzzzzzzZ");
4650    }
4651
4652    #[test]
4653    fn binary_logic_shift_l() {
4654        //x = 8'h03  << 2; $display("%b", x); // 0000000000001100
4655        //x = 8'hf1  << 2; $display("%b", x); // 0000001111000100
4656        //x = 8'hx3  << 2; $display("%b", x); // 000000xxxx001100
4657        //x = 8'hz4  << 2; $display("%b", x); // 000000zzzz010000
4658        //x = 8'sh03 << 2; $display("%b", x); // 0000000000001100
4659        //x = 8'shf1 << 2; $display("%b", x); // 1111111111000100
4660        //x = 8'shx3 << 2; $display("%b", x); // xxxxxxxxxx001100
4661        //x = 8'shz4 << 2; $display("%b", x); // zzzzzzzzzz010000
4662
4663        let op = Op::LogicShiftL;
4664        let mut cache = MaskCache::default();
4665
4666        let x00 = Value::from_str("8'h03").unwrap();
4667        let x01 = Value::from_str("8'hf1").unwrap();
4668        let x02 = Value::from_str("8'hx3").unwrap();
4669        let x03 = Value::from_str("8'hz4").unwrap();
4670        let x04 = Value::from_str("8'sh03").unwrap();
4671        let x05 = Value::from_str("8'shf1").unwrap();
4672        let x06 = Value::from_str("8'shx3").unwrap();
4673        let x07 = Value::from_str("8'shz4").unwrap();
4674        let x10 = Value::from_str("2").unwrap();
4675        let x11 = Value::from_str("2").unwrap();
4676        let x12 = Value::from_str("2").unwrap();
4677        let x13 = Value::from_str("2").unwrap();
4678        let x14 = Value::from_str("2").unwrap();
4679        let x15 = Value::from_str("2").unwrap();
4680        let x16 = Value::from_str("2").unwrap();
4681        let x17 = Value::from_str("2").unwrap();
4682        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4683        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4684        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4685        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4686        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4687        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4688        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4689        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4690        assert_eq!(format!("{:b}", x00), "16'b0000000000001100");
4691        assert_eq!(format!("{:b}", x01), "16'b0000001111000100");
4692        assert_eq!(format!("{:b}", x02), "16'b000000xxxx001100");
4693        assert_eq!(format!("{:b}", x03), "16'b000000zzzz010000");
4694        assert_eq!(format!("{:b}", x04), "16'b0000000000001100");
4695        assert_eq!(format!("{:b}", x05), "16'b1111111111000100");
4696        assert_eq!(format!("{:b}", x06), "16'bxxxxxxxxxx001100");
4697        assert_eq!(format!("{:b}", x07), "16'bzzzzzzzzzz010000");
4698
4699        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4700        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4701        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4702        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4703        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4704        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4705        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4706        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4707        let x10 = Value::from_str("2").unwrap();
4708        let x11 = Value::from_str("2").unwrap();
4709        let x12 = Value::from_str("2").unwrap();
4710        let x13 = Value::from_str("2").unwrap();
4711        let x14 = Value::from_str("2").unwrap();
4712        let x15 = Value::from_str("2").unwrap();
4713        let x16 = Value::from_str("2").unwrap();
4714        let x17 = Value::from_str("2").unwrap();
4715        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4716        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4717        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4718        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4719        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4720        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4721        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4722        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4723        assert_eq!(format!("{:x}", x00), "68'h0000000000000000c");
4724        assert_eq!(format!("{:x}", x01), "68'hfffffffffffffffc4");
4725        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxXc");
4726        assert_eq!(format!("{:x}", x03), "68'hzzzzzzzzzzzzzzzZ0");
4727        assert_eq!(format!("{:x}", x04), "68'h0000000000000000c");
4728        assert_eq!(format!("{:x}", x05), "68'hfffffffffffffffc4");
4729        assert_eq!(format!("{:x}", x06), "68'hxxxxxxxxxxxxxxxXc");
4730        assert_eq!(format!("{:x}", x07), "68'hzzzzzzzzzzzzzzzZ0");
4731    }
4732
4733    #[test]
4734    fn binary_arith_shift_r() {
4735        //x = 8'h03  >>> 2; $display("%b", x); // 0000000000000000
4736        //x = 8'hf1  >>> 2; $display("%b", x); // 0000000000111100
4737        //x = 8'hx3  >>> 2; $display("%b", x); // 0000000000xxxx00
4738        //x = 8'hz4  >>> 2; $display("%b", x); // 0000000000zzzz01
4739        //x = 8'sh03 >>> 2; $display("%b", x); // 0000000000000000
4740        //x = 8'shf1 >>> 2; $display("%b", x); // 1111111111111100
4741        //x = 8'shx3 >>> 2; $display("%b", x); // xxxxxxxxxxxxxx00
4742        //x = 8'shz4 >>> 2; $display("%b", x); // zzzzzzzzzzzzzz01
4743
4744        let op = Op::ArithShiftR;
4745        let mut cache = MaskCache::default();
4746
4747        let x00 = Value::from_str("8'h03").unwrap();
4748        let x01 = Value::from_str("8'hf1").unwrap();
4749        let x02 = Value::from_str("8'hx3").unwrap();
4750        let x03 = Value::from_str("8'hz4").unwrap();
4751        let x04 = Value::from_str("8'sh03").unwrap();
4752        let x05 = Value::from_str("8'shf1").unwrap();
4753        let x06 = Value::from_str("8'shx3").unwrap();
4754        let x07 = Value::from_str("8'shz4").unwrap();
4755        let x10 = Value::from_str("2").unwrap();
4756        let x11 = Value::from_str("2").unwrap();
4757        let x12 = Value::from_str("2").unwrap();
4758        let x13 = Value::from_str("2").unwrap();
4759        let x14 = Value::from_str("2").unwrap();
4760        let x15 = Value::from_str("2").unwrap();
4761        let x16 = Value::from_str("2").unwrap();
4762        let x17 = Value::from_str("2").unwrap();
4763        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4764        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4765        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4766        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4767        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4768        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4769        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4770        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4771        assert_eq!(format!("{:b}", x00), "16'b0000000000000000");
4772        assert_eq!(format!("{:b}", x01), "16'b0000000000111100");
4773        assert_eq!(format!("{:b}", x02), "16'b0000000000xxxx00");
4774        assert_eq!(format!("{:b}", x03), "16'b0000000000zzzz01");
4775        assert_eq!(format!("{:b}", x04), "16'sb0000000000000000");
4776        assert_eq!(format!("{:b}", x05), "16'sb1111111111111100");
4777        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxxxxxx00");
4778        assert_eq!(format!("{:b}", x07), "16'sbzzzzzzzzzzzzzz01");
4779
4780        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4781        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4782        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4783        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4784        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4785        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4786        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4787        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4788        let x10 = Value::from_str("2").unwrap();
4789        let x11 = Value::from_str("2").unwrap();
4790        let x12 = Value::from_str("2").unwrap();
4791        let x13 = Value::from_str("2").unwrap();
4792        let x14 = Value::from_str("2").unwrap();
4793        let x15 = Value::from_str("2").unwrap();
4794        let x16 = Value::from_str("2").unwrap();
4795        let x17 = Value::from_str("2").unwrap();
4796        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4797        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4798        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4799        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4800        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4801        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4802        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4803        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4804        assert_eq!(format!("{:x}", x00), "68'h00000000000000000");
4805        assert_eq!(format!("{:x}", x01), "68'h3fffffffffffffffc");
4806        assert_eq!(format!("{:x}", x02), "68'hXxxxxxxxxxxxxxxxX");
4807        assert_eq!(format!("{:x}", x03), "68'hZzzzzzzzzzzzzzzzZ");
4808        assert_eq!(format!("{:x}", x04), "68'sh00000000000000000");
4809        assert_eq!(format!("{:x}", x05), "68'shffffffffffffffffc");
4810        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxxX");
4811        assert_eq!(format!("{:x}", x07), "68'shzzzzzzzzzzzzzzzzZ");
4812    }
4813
4814    #[test]
4815    fn binary_arith_shift_l() {
4816        //x = 8'h03  <<< 2; $display("%b", x); // 0000000000001100
4817        //x = 8'hf1  <<< 2; $display("%b", x); // 0000001111000100
4818        //x = 8'hx3  <<< 2; $display("%b", x); // 000000xxxx001100
4819        //x = 8'hz4  <<< 2; $display("%b", x); // 000000zzzz010000
4820        //x = 8'sh03 <<< 2; $display("%b", x); // 0000000000001100
4821        //x = 8'shf1 <<< 2; $display("%b", x); // 1111111111000100
4822        //x = 8'shx3 <<< 2; $display("%b", x); // xxxxxxxxxx001100
4823        //x = 8'shz4 <<< 2; $display("%b", x); // zzzzzzzzzz010000
4824
4825        let op = Op::ArithShiftL;
4826        let mut cache = MaskCache::default();
4827
4828        let x00 = Value::from_str("8'h03").unwrap();
4829        let x01 = Value::from_str("8'hf1").unwrap();
4830        let x02 = Value::from_str("8'hx3").unwrap();
4831        let x03 = Value::from_str("8'hz4").unwrap();
4832        let x04 = Value::from_str("8'sh03").unwrap();
4833        let x05 = Value::from_str("8'shf1").unwrap();
4834        let x06 = Value::from_str("8'shx3").unwrap();
4835        let x07 = Value::from_str("8'shz4").unwrap();
4836        let x10 = Value::from_str("2").unwrap();
4837        let x11 = Value::from_str("2").unwrap();
4838        let x12 = Value::from_str("2").unwrap();
4839        let x13 = Value::from_str("2").unwrap();
4840        let x14 = Value::from_str("2").unwrap();
4841        let x15 = Value::from_str("2").unwrap();
4842        let x16 = Value::from_str("2").unwrap();
4843        let x17 = Value::from_str("2").unwrap();
4844        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4845        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4846        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4847        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4848        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4849        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4850        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4851        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4852        assert_eq!(format!("{:b}", x00), "16'b0000000000001100");
4853        assert_eq!(format!("{:b}", x01), "16'b0000001111000100");
4854        assert_eq!(format!("{:b}", x02), "16'b000000xxxx001100");
4855        assert_eq!(format!("{:b}", x03), "16'b000000zzzz010000");
4856        assert_eq!(format!("{:b}", x04), "16'sb0000000000001100");
4857        assert_eq!(format!("{:b}", x05), "16'sb1111111111000100");
4858        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxx001100");
4859        assert_eq!(format!("{:b}", x07), "16'sbzzzzzzzzzz010000");
4860
4861        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4862        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4863        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4864        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4865        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4866        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4867        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4868        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4869        let x10 = Value::from_str("2").unwrap();
4870        let x11 = Value::from_str("2").unwrap();
4871        let x12 = Value::from_str("2").unwrap();
4872        let x13 = Value::from_str("2").unwrap();
4873        let x14 = Value::from_str("2").unwrap();
4874        let x15 = Value::from_str("2").unwrap();
4875        let x16 = Value::from_str("2").unwrap();
4876        let x17 = Value::from_str("2").unwrap();
4877        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4878        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4879        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4880        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4881        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4882        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4883        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4884        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4885        assert_eq!(format!("{:x}", x00), "68'h0000000000000000c");
4886        assert_eq!(format!("{:x}", x01), "68'hfffffffffffffffc4");
4887        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxXc");
4888        assert_eq!(format!("{:x}", x03), "68'hzzzzzzzzzzzzzzzZ0");
4889        assert_eq!(format!("{:x}", x04), "68'sh0000000000000000c");
4890        assert_eq!(format!("{:x}", x05), "68'shfffffffffffffffc4");
4891        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxXc");
4892        assert_eq!(format!("{:x}", x07), "68'shzzzzzzzzzzzzzzzZ0");
4893    }
4894
4895    #[test]
4896    fn binary_pow() {
4897        //x = 8'h03  ** 2; $display("%b", x); // 0000000000001001
4898        //x = 8'hf1  ** 2; $display("%b", x); // 1110001011100001
4899        //x = 8'hx3  ** 2; $display("%b", x); // xxxxxxxxxxxxxxxx
4900        //x = 8'hz4  ** 2; $display("%b", x); // xxxxxxxxxxxxxxxx
4901        //x = 8'sh03 ** 2; $display("%b", x); // 0000000000001001
4902        //x = 8'shf1 ** 2; $display("%b", x); // 0000000011100001
4903        //x = 8'shx3 ** 2; $display("%b", x); // xxxxxxxxxxxxxxxx
4904        //x = 8'shz4 ** 2; $display("%b", x); // xxxxxxxxxxxxxxxx
4905
4906        let op = Op::Pow;
4907        let mut cache = MaskCache::default();
4908
4909        let x00 = Value::from_str("8'h03").unwrap();
4910        let x01 = Value::from_str("8'hf1").unwrap();
4911        let x02 = Value::from_str("8'hx3").unwrap();
4912        let x03 = Value::from_str("8'hz4").unwrap();
4913        let x04 = Value::from_str("8'sh03").unwrap();
4914        let x05 = Value::from_str("8'shf1").unwrap();
4915        let x06 = Value::from_str("8'shx3").unwrap();
4916        let x07 = Value::from_str("8'shz4").unwrap();
4917        let x10 = Value::from_str("2").unwrap();
4918        let x11 = Value::from_str("2").unwrap();
4919        let x12 = Value::from_str("2").unwrap();
4920        let x13 = Value::from_str("2").unwrap();
4921        let x14 = Value::from_str("2").unwrap();
4922        let x15 = Value::from_str("2").unwrap();
4923        let x16 = Value::from_str("2").unwrap();
4924        let x17 = Value::from_str("2").unwrap();
4925        let x00 = op.eval_value_binary(&x00, &x10, 16, false, &mut cache);
4926        let x01 = op.eval_value_binary(&x01, &x11, 16, false, &mut cache);
4927        let x02 = op.eval_value_binary(&x02, &x12, 16, false, &mut cache);
4928        let x03 = op.eval_value_binary(&x03, &x13, 16, false, &mut cache);
4929        let x04 = op.eval_value_binary(&x04, &x14, 16, true, &mut cache);
4930        let x05 = op.eval_value_binary(&x05, &x15, 16, true, &mut cache);
4931        let x06 = op.eval_value_binary(&x06, &x16, 16, true, &mut cache);
4932        let x07 = op.eval_value_binary(&x07, &x17, 16, true, &mut cache);
4933        assert_eq!(format!("{:b}", x00), "16'b0000000000001001");
4934        assert_eq!(format!("{:b}", x01), "16'b1110001011100001");
4935        assert_eq!(format!("{:b}", x02), "16'bxxxxxxxxxxxxxxxx");
4936        assert_eq!(format!("{:b}", x03), "16'bxxxxxxxxxxxxxxxx");
4937        assert_eq!(format!("{:b}", x04), "16'sb0000000000001001");
4938        assert_eq!(format!("{:b}", x05), "16'sb0000000011100001");
4939        assert_eq!(format!("{:b}", x06), "16'sbxxxxxxxxxxxxxxxx");
4940        assert_eq!(format!("{:b}", x07), "16'sbxxxxxxxxxxxxxxxx");
4941
4942        let x00 = Value::from_str("68'h00000000000000003").unwrap();
4943        let x01 = Value::from_str("68'hffffffffffffffff1").unwrap();
4944        let x02 = Value::from_str("68'hxxxxxxxxxxxxxxxx3").unwrap();
4945        let x03 = Value::from_str("68'hzzzzzzzzzzzzzzzz4").unwrap();
4946        let x04 = Value::from_str("68'sh00000000000000003").unwrap();
4947        let x05 = Value::from_str("68'shffffffffffffffff1").unwrap();
4948        let x06 = Value::from_str("68'shxxxxxxxxxxxxxxxx3").unwrap();
4949        let x07 = Value::from_str("68'shzzzzzzzzzzzzzzzz4").unwrap();
4950        let x10 = Value::from_str("2").unwrap();
4951        let x11 = Value::from_str("2").unwrap();
4952        let x12 = Value::from_str("2").unwrap();
4953        let x13 = Value::from_str("2").unwrap();
4954        let x14 = Value::from_str("2").unwrap();
4955        let x15 = Value::from_str("2").unwrap();
4956        let x16 = Value::from_str("2").unwrap();
4957        let x17 = Value::from_str("2").unwrap();
4958        let x00 = op.eval_value_binary(&x00, &x10, 68, false, &mut cache);
4959        let x01 = op.eval_value_binary(&x01, &x11, 68, false, &mut cache);
4960        let x02 = op.eval_value_binary(&x02, &x12, 68, false, &mut cache);
4961        let x03 = op.eval_value_binary(&x03, &x13, 68, false, &mut cache);
4962        let x04 = op.eval_value_binary(&x04, &x14, 68, true, &mut cache);
4963        let x05 = op.eval_value_binary(&x05, &x15, 68, true, &mut cache);
4964        let x06 = op.eval_value_binary(&x06, &x16, 68, true, &mut cache);
4965        let x07 = op.eval_value_binary(&x07, &x17, 68, true, &mut cache);
4966        assert_eq!(format!("{:x}", x00), "68'h00000000000000009");
4967        assert_eq!(format!("{:x}", x01), "68'hf00000000000000e1");
4968        assert_eq!(format!("{:x}", x02), "68'hxxxxxxxxxxxxxxxxx");
4969        assert_eq!(format!("{:x}", x03), "68'hxxxxxxxxxxxxxxxxx");
4970        assert_eq!(format!("{:x}", x04), "68'sh00000000000000009");
4971        assert_eq!(format!("{:x}", x05), "68'sh000000000000000e1");
4972        assert_eq!(format!("{:x}", x06), "68'shxxxxxxxxxxxxxxxxx");
4973        assert_eq!(format!("{:x}", x07), "68'shxxxxxxxxxxxxxxxxx");
4974    }
4975
4976    #[test]
4977    fn test_string_to_byte_value_basic() {
4978        let v = string_to_byte_value("\"abc\"");
4979        assert_eq!(v.width(), 24);
4980        assert_eq!(v.payload_u64(), 0x616263);
4981        assert!(!v.signed());
4982    }
4983
4984    #[test]
4985    fn test_string_to_byte_value_empty() {
4986        let v = string_to_byte_value("\"\"");
4987        assert_eq!(v.width(), 0);
4988        assert_eq!(v.payload_u64(), 0);
4989    }
4990
4991    #[test]
4992    fn test_string_to_byte_value_single_char() {
4993        let v = string_to_byte_value("\"A\"");
4994        assert_eq!(v.width(), 8);
4995        assert_eq!(v.payload_u64(), 0x41);
4996    }
4997
4998    #[test]
4999    fn test_string_to_byte_value_escape_sequences() {
5000        let v = string_to_byte_value("\"\\n\"");
5001        assert_eq!(v.width(), 8);
5002        assert_eq!(v.payload_u64(), 0x0a);
5003
5004        let v = string_to_byte_value("\"\\t\"");
5005        assert_eq!(v.width(), 8);
5006        assert_eq!(v.payload_u64(), 0x09);
5007
5008        let v = string_to_byte_value("\"a\\nb\"");
5009        assert_eq!(v.width(), 24);
5010        assert_eq!(v.payload_u64(), 0x610a62);
5011    }
5012
5013    #[test]
5014    fn test_string_to_byte_value_8_chars() {
5015        let v = string_to_byte_value("\"abcdefgh\"");
5016        assert_eq!(v.width(), 64);
5017        assert_eq!(v.payload_u64(), 0x6162636465666768);
5018    }
5019
5020    #[test]
5021    fn test_string_to_byte_value_over_8_chars() {
5022        let v = string_to_byte_value("\"abcdefghi\"");
5023        assert_eq!(v.width(), 72);
5024        let expected = BigUint::from(0x6162636465666768u64) << 8 | BigUint::from(0x69u64);
5025        assert_eq!(*v.payload(), expected);
5026    }
5027
5028    #[test]
5029    fn test_byte_value_to_string_basic() {
5030        let v = string_to_byte_value("\"abc\"");
5031        assert_eq!(byte_value_to_string(&v), Some("abc".to_string()));
5032    }
5033
5034    #[test]
5035    fn test_byte_value_to_string_empty() {
5036        let v = string_to_byte_value("\"\"");
5037        assert_eq!(byte_value_to_string(&v), Some("".to_string()));
5038    }
5039
5040    #[test]
5041    fn test_byte_value_to_string_roundtrip_escape() {
5042        let v = string_to_byte_value("\"a\\nb\"");
5043        assert_eq!(byte_value_to_string(&v), Some("a\nb".to_string()));
5044    }
5045
5046    #[test]
5047    fn test_byte_value_to_string_roundtrip_long() {
5048        let v = string_to_byte_value("\"abcdefghi\"");
5049        assert_eq!(byte_value_to_string(&v), Some("abcdefghi".to_string()));
5050    }
5051
5052    #[test]
5053    fn test_byte_value_to_string_non_byte_aligned() {
5054        let v = Value::new(0x41, 7, false);
5055        assert_eq!(byte_value_to_string(&v), None);
5056    }
5057
5058    fn f64_val(f: f64) -> Value {
5059        Value::new(f.to_bits(), 64, false)
5060    }
5061
5062    fn val_to_f64(v: &Value) -> f64 {
5063        f64::from_bits(v.to_u64().unwrap())
5064    }
5065
5066    #[test]
5067    fn float_binary_arithmetic() {
5068        let a = f64_val(440.0);
5069        let b = f64_val(281474976710656.0); // 2^48
5070        let c = f64_val(50_000_000.0);
5071
5072        let r = Op::Mul.eval_float_binary(&a, &b, &TypeKind::F64).unwrap();
5073        assert_eq!(val_to_f64(&r), 440.0 * 281474976710656.0);
5074
5075        let r = Op::Div.eval_float_binary(&r, &c, &TypeKind::F64).unwrap();
5076        assert_eq!(val_to_f64(&r), (440.0 * 281474976710656.0) / 50_000_000.0);
5077        assert_eq!(val_to_f64(&r) as i64, 2476979795);
5078
5079        let r = Op::Add
5080            .eval_float_binary(&f64_val(1.5), &f64_val(2.25), &TypeKind::F64)
5081            .unwrap();
5082        assert_eq!(val_to_f64(&r), 3.75);
5083
5084        let r = Op::Sub
5085            .eval_float_binary(&f64_val(10.0), &f64_val(3.5), &TypeKind::F64)
5086            .unwrap();
5087        assert_eq!(val_to_f64(&r), 6.5);
5088
5089        let r = Op::Rem
5090            .eval_float_binary(&f64_val(10.0), &f64_val(3.0), &TypeKind::F64)
5091            .unwrap();
5092        assert_eq!(val_to_f64(&r), 1.0);
5093
5094        let r = Op::Pow
5095            .eval_float_binary(&f64_val(2.0), &f64_val(10.0), &TypeKind::F64)
5096            .unwrap();
5097        assert_eq!(val_to_f64(&r), 1024.0);
5098    }
5099
5100    #[test]
5101    fn float_binary_comparison() {
5102        let a = f64_val(1.0);
5103        let b = f64_val(2.0);
5104
5105        assert_eq!(
5106            Op::Less.eval_float_binary(&a, &b, &TypeKind::F64).unwrap(),
5107            Value::new(1, 1, false)
5108        );
5109        assert_eq!(
5110            Op::Greater
5111                .eval_float_binary(&a, &b, &TypeKind::F64)
5112                .unwrap(),
5113            Value::new(0, 1, false)
5114        );
5115        assert_eq!(
5116            Op::Eq.eval_float_binary(&a, &a, &TypeKind::F64).unwrap(),
5117            Value::new(1, 1, false)
5118        );
5119        assert_eq!(
5120            Op::Ne.eval_float_binary(&a, &b, &TypeKind::F64).unwrap(),
5121            Value::new(1, 1, false)
5122        );
5123        assert_eq!(
5124            Op::LessEq
5125                .eval_float_binary(&a, &a, &TypeKind::F64)
5126                .unwrap(),
5127            Value::new(1, 1, false)
5128        );
5129        assert_eq!(
5130            Op::GreaterEq
5131                .eval_float_binary(&b, &a, &TypeKind::F64)
5132                .unwrap(),
5133            Value::new(1, 1, false)
5134        );
5135    }
5136
5137    #[test]
5138    fn float_unary() {
5139        let a = f64_val(42.0);
5140
5141        let r = Op::Add.eval_float_unary(&a, &TypeKind::F64).unwrap();
5142        assert_eq!(val_to_f64(&r), 42.0);
5143
5144        let r = Op::Sub.eval_float_unary(&a, &TypeKind::F64).unwrap();
5145        assert_eq!(val_to_f64(&r), -42.0);
5146    }
5147
5148    #[test]
5149    fn float_div_by_zero() {
5150        let a = f64_val(1.0);
5151        let zero = f64_val(0.0);
5152        assert!(
5153            Op::Div
5154                .eval_float_binary(&a, &zero, &TypeKind::F64)
5155                .is_none()
5156        );
5157        assert!(
5158            Op::Rem
5159                .eval_float_binary(&a, &zero, &TypeKind::F64)
5160                .is_none()
5161        );
5162    }
5163
5164    #[test]
5165    fn float_unsupported_op() {
5166        let a = f64_val(1.0);
5167        assert!(
5168            Op::BitAnd
5169                .eval_float_binary(&a, &a, &TypeKind::F64)
5170                .is_none()
5171        );
5172        assert!(Op::BitNot.eval_float_unary(&a, &TypeKind::F64).is_none());
5173    }
5174}