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
9fn 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 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
61pub 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
84pub 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
115pub 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
125pub 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
136pub 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
148pub fn biguint_from_le_bytes(buf: &[u8]) -> BigUint {
150 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)]
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 pub fn payload_u128(&self) -> u128 {
730 biguint_to_u128(&self.payload)
731 }
732
733 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 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 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 pub fn write_payload_to_bytes(&self, buf: &mut [u8]) {
1380 biguint_to_le_bytes(&self.payload(), buf);
1381 }
1382
1383 pub fn write_mask_xz_to_bytes(&self, buf: &mut [u8]) {
1386 biguint_to_le_bytes(&self.mask_xz(), buf);
1387 }
1388
1389 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 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#[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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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); 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}