25class CborByteDecoder {
27 using CounterL = Counter<Logic>;
28 using Field =
typename Logic::Field;
29 using EltW =
typename Logic::EltW;
30 using CEltW =
typename CounterL::CEltW;
32 using v8 =
typename Logic::v8;
34 explicit CborByteDecoder(
const Logic& l) : l_(l), ctr_(l) {}
54 BitW length_plus_next_v8;
55 BitW count_is_next_v8;
60 CEltW count_as_counter;
67 struct decode decode_one_v8(const v8& v)
const {
73 auto count = L.template slice<0, 5>(v);
74 auto type = L.template slice<5, 8>(v);
76 s.atomp = L.veqmask(type, 0b110, 0b000);
77 s.stringp = L.veqmask(type, 0b110, 0b010);
78 s.itemsp = L.veqmask(type, 0b110, 0b100);
80 s.specialp = L.veq(type, 7);
81 s.tagp = L.veq(type, 6);
82 s.arrayp = L.land(&s.itemsp, L.lnot(type[0]));
83 s.mapp = L.land(&s.itemsp, type[0]);
86 s.count0_23 = L.lnot(L.veqmask(count, 0b11000, 0b11000));
87 s.count24_27 = L.veqmask(count, 0b11100, 0b11000);
89 s.count24 = L.veq(count, 24);
90 s.count25 = L.veq(count, 25);
91 s.count26 = L.veq(count, 26);
92 s.count27 = L.veq(count, 27);
94 BitW count20_23 = L.veqmask(count, 0b11100, 0b10100);
95 s.simple_specialp = L.land(&s.specialp, count20_23);
98 s.length_plus_next_v8 =
99 L.veqmask(v, 0b110'11111, 0b010'11000);
103 L.veqmask(v, 0b110'11111, 0b100'11000);
105 BitW count0_24 = L.lor_exclusive(&s.count24, s.count0_23);
106 BitW atom_or_tag = L.lor_exclusive(&s.atomp, s.tagp);
110 BitW good_count = L.lor(&count0_24, L.land(&atom_or_tag, s.count24_27));
111 BitW invalid_special = L.land(&s.specialp, L.lnot(s.simple_specialp));
112 s.invalid = L.lor(&invalid_special, L.lnot(good_count));
114 s.count_as_counter = ctr_.as_counter(count);
120 CEltW l1 = ctr_.as_counter(1 + 1);
121 CEltW l2 = ctr_.as_counter(1 + 2);
122 CEltW l4 = ctr_.as_counter(1 + 4);
123 CEltW l8 = ctr_.as_counter(1 + 8);
124 CEltW l24_25 = ctr_.mux(&count[0], &l2, l1);
125 CEltW l26_27 = ctr_.mux(&count[0], &l8, l4);
126 CEltW l24_27 = ctr_.mux(&count[1], &l26_27, l24_25);
129 CEltW x1 = ctr_.as_counter(1);
130 s.length = ctr_.mux(&s.count0_23, &x1, l24_27);
133 BitW str_23 = L.land(&s.stringp, s.count0_23);
134 CEltW adjust_if_string = ctr_.ite0(&str_23, s.count_as_counter);
135 s.length = ctr_.add(&s.length, adjust_if_string);
137 s.as_counter = ctr_.as_counter(v);
138 s.as_scalar = L.as_scalar(v);