use gatesim::*;
use gateutil::*;
use std::str::FromStr;
#[test]
fn test_assign_to_circuit_and_optimize_testi0() {
use OutputEntry::{NewIndex, Value};
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
and(0,6):0
and(0,7)
and(1,6)
xor(13,14):1
and(0,8)
and(1,7)
and(2,6)
xor(17,18)
xor(16,19)
and(13,14)
xor(20,21):2
and(0,9)
and(1,8)
xor(23,24)
and(2,7)
and(3,6)
xor(26,27)
xor(25,28)
and(17,18)
xor(29,30)
and(20,21)
and(16,19)
nor(32,33)
xor(31,34):3n
and(0,10)
and(1,9)
and(2,8)
xor(37,38)
and(3,7)
and(4,6)
xor(40,41)
xor(39,42)
xor(36,43)
and(26,27)
xor(44,45)
and(25,28)
and(23,24)
nor(47,48)
xor(46,49)
nimpl(31,34)
and(29,30)
nor(51,52)
xor(50,53):4
and(0,11)
and(1,10)
and(2,9)
xor(56,57)
and(3,8)
xor(58,59)
and(4,7)
and(5,6)
xor(61,62)
xor(60,63)
and(40,41)
xor(64,65)
xor(55,66)
and(39,42)
and(37,38)
nor(68,69)
xor(67,70)
and(44,45)
and(36,43)
nor(72,73)
xor(71,74)
nor(50,53)
nimpl(46,49)
nor(76,77)
xor(75,78):5n
and(1,11)
and(2,10)
xor(80,81)
and(3,9)
xor(82,83)
and(4,8)
and(5,7)
xor(85,86)
and(58,59)
and(56,57)
nor(88,89)
xor(87,90)
and(61,62)
xor(91,92)
xor(84,93)
and(64,65)
and(60,63)
nor(95,96)
xor(94,97)
nimpl(67,70)
and(55,66)
nor(99,100)
xor(98,101)
nimpl(75,78)
nor(71,74)
nor(103,104)
xor(102,105):6
and(2,11)
and(3,10)
and(4,9)
xor(108,109)
and(5,8)
xor(110,111)
and(82,83)
and(80,81)
nor(113,114)
xor(112,115)
and(85,86)
xor(116,117)
xor(107,118)
nimpl(92,91)
nimpl(87,90)
nor(120,121)
xor(119,122)
nor(94,97)
nimpl(84,93)
nor(124,125)
xor(123,126)
nor(102,105)
nimpl(98,101)
nor(128,129)
xor(127,130):7
and(3,11)
and(4,10)
and(5,9)
xor(133,134)
and(110,111)
and(108,109)
nor(136,137)
xor(135,138)
xor(132,139)
nimpl(117,116)
nimpl(112,115)
nor(141,142)
xor(140,143)
nor(119,122)
nimpl(107,118)
nor(145,146)
xor(144,147)
nor(127,130)
nimpl(123,126)
nor(149,150)
xor(148,151):8
and(4,11)
and(5,10)
xor(153,154)
nimpl(135,138)
and(133,134)
nor(156,157)
xor(155,158)
nor(140,143)
nimpl(132,139)
nor(160,161)
xor(159,162)
nor(148,151)
nimpl(144,147)
nor(164,165)
xor(163,166):9n
and(5,11)
nimpl(155,158)
and(153,154)
nor(169,170)
xor(168,171)
nimpl(163,166)
nor(159,162)
nor(173,174)
xor(172,175):10
nor(172,175)
nimpl(168,171)
nor(177,178):11n
}(12)
"##,
)
.unwrap();
let inputv = 38 | (21 << 6);
assert_eq!(
(
Circuit::from_str("{ 0:0:1:2 }(1)").unwrap(),
vec![
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(true),
Value(true),
Value(false),
Value(true),
Value(false),
Value(true),
NewIndex(0)
],
vec![
Value(false),
Value(true),
Value(true),
Value(true),
Value(true),
Value(false),
NewIndex(0),
NewIndex(1),
Value(true),
Value(true),
NewIndex(2),
Value(false)
]
),
assign_to_circuit_and_optimize(
&circuit,
(0..11).map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
and(0,8):0
and(0,9)
and(1,8)
xor(17,18):1
and(0,10)
and(1,9)
and(2,8)
xor(21,22)
xor(20,23)
and(17,18)
xor(24,25):2
and(0,11)
and(1,10)
xor(27,28)
and(2,9)
and(3,8)
xor(30,31)
xor(29,32)
and(21,22)
xor(33,34)
and(24,25)
and(20,23)
nor(36,37)
xor(35,38):3n
and(0,12)
and(1,11)
and(2,10)
xor(41,42)
and(3,9)
and(4,8)
xor(44,45)
xor(43,46)
xor(40,47)
and(30,31)
xor(48,49)
and(29,32)
and(27,28)
nor(51,52)
xor(50,53)
nimpl(35,38)
and(33,34)
nor(55,56)
xor(54,57):4
and(0,13)
and(1,12)
and(2,11)
xor(60,61)
and(3,10)
xor(62,63)
and(4,9)
and(5,8)
xor(65,66)
xor(64,67)
and(44,45)
xor(68,69)
xor(59,70)
and(43,46)
and(41,42)
nor(72,73)
xor(71,74)
and(48,49)
and(40,47)
nor(76,77)
xor(75,78)
nor(54,57)
nimpl(50,53)
nor(80,81)
xor(79,82):5n
and(0,14)
and(1,13)
xor(84,85)
and(2,12)
xor(86,87)
and(3,11)
and(4,10)
xor(89,90)
and(5,9)
and(6,8)
xor(92,93)
xor(91,94)
and(62,63)
and(60,61)
nor(96,97)
xor(95,98)
and(65,66)
xor(99,100)
xor(88,101)
and(68,69)
and(64,67)
nor(103,104)
xor(102,105)
nimpl(71,74)
and(59,70)
nor(107,108)
xor(106,109)
nimpl(79,82)
nor(75,78)
nor(111,112)
xor(110,113):6
and(0,15)
and(1,14)
xor(115,116)
and(2,13)
xor(117,118)
and(3,12)
and(4,11)
xor(120,121)
and(5,10)
xor(122,123)
and(6,9)
and(7,8)
xor(125,126)
xor(124,127)
and(92,93)
xor(128,129)
and(86,87)
and(84,85)
nor(131,132)
xor(130,133)
and(91,94)
and(89,90)
nor(135,136)
xor(134,137)
xor(119,138)
nimpl(100,99)
nimpl(95,98)
nor(140,141)
xor(139,142)
nor(102,105)
nimpl(88,101)
nor(144,145)
xor(143,146)
nor(110,113)
nimpl(106,109)
nor(148,149)
xor(147,150):7n
and(1,15)
and(2,14)
xor(152,153)
and(3,13)
and(4,12)
xor(155,156)
and(5,11)
xor(157,158)
xor(154,159)
and(6,10)
and(7,9)
xor(161,162)
and(122,123)
and(120,121)
nor(164,165)
xor(163,166)
and(125,126)
xor(167,168)
and(117,118)
and(115,116)
nor(170,171)
xor(169,172)
and(128,129)
and(124,127)
nor(174,175)
xor(173,176)
xor(160,177)
nor(134,137)
nimpl(130,133)
nor(179,180)
xor(178,181)
nimpl(139,142)
and(119,138)
nor(183,184)
xor(182,185)
nimpl(147,150)
nor(143,146)
nor(187,188)
xor(186,189):8
and(2,15)
and(3,14)
xor(191,192)
and(4,13)
xor(193,194)
and(5,12)
and(6,11)
xor(196,197)
and(7,10)
xor(198,199)
and(157,158)
and(155,156)
nor(201,202)
xor(200,203)
and(161,162)
xor(204,205)
and(154,159)
and(152,153)
nor(207,208)
xor(206,209)
nimpl(168,167)
nimpl(163,166)
nor(211,212)
xor(210,213)
xor(195,214)
nimpl(173,176)
nor(169,172)
nor(216,217)
xor(215,218)
nor(178,181)
nimpl(160,177)
nor(220,221)
xor(219,222)
nor(186,189)
nimpl(182,185)
nor(224,225)
xor(223,226):9
and(3,15)
and(4,14)
xor(228,229)
and(5,13)
xor(230,231)
and(6,12)
and(7,11)
xor(233,234)
and(198,199)
and(196,197)
nor(236,237)
xor(235,238)
and(193,194)
and(191,192)
nor(240,241)
xor(239,242)
nimpl(205,204)
nimpl(200,203)
nor(244,245)
xor(243,246)
xor(232,247)
nimpl(210,213)
nor(206,209)
nor(249,250)
xor(248,251)
nor(215,218)
nimpl(195,214)
nor(253,254)
xor(252,255)
nor(223,226)
nimpl(219,222)
nor(257,258)
xor(256,259):10
and(4,15)
and(5,14)
and(6,13)
xor(262,263)
and(7,12)
xor(264,265)
and(230,231)
and(228,229)
nor(267,268)
xor(266,269)
nimpl(235,238)
and(233,234)
nor(271,272)
xor(270,273)
xor(261,274)
nimpl(243,246)
nor(239,242)
nor(276,277)
xor(275,278)
nor(248,251)
nimpl(232,247)
nor(280,281)
xor(279,282)
nor(256,259)
nimpl(252,255)
nor(284,285)
xor(283,286):11n
and(5,15)
and(6,14)
and(7,13)
xor(289,290)
and(264,265)
and(262,263)
nor(292,293)
xor(291,294)
xor(288,295)
nor(270,273)
nimpl(266,269)
nor(297,298)
xor(296,299)
nimpl(275,278)
and(261,274)
nor(301,302)
xor(300,303)
nimpl(283,286)
nor(279,282)
nor(305,306)
xor(304,307):12
and(6,15)
and(7,14)
xor(309,310)
nimpl(291,294)
and(289,290)
nor(312,313)
xor(311,314)
nor(296,299)
nimpl(288,295)
nor(316,317)
xor(315,318)
nor(304,307)
nimpl(300,303)
nor(320,321)
xor(319,322):13n
and(7,15)
nimpl(311,314)
and(309,310)
nor(325,326)
xor(324,327)
nimpl(319,322)
nor(315,318)
nor(329,330)
xor(328,331):14
nor(328,331)
nimpl(324,327)
nor(333,334):15n
}(16)
"##,
)
.unwrap();
let inputv = 69 | (22 << 8);
assert_eq!(
(
Circuit::from_str(
r##"{
0:0n:6
1:7
xor(0,1):1n
nimpl(1,0):2n
xor(0,1)
xor(3,4):3
and(3,4)
and(0,1)
nor(6,7):4:5n
}(2)
"##
)
.unwrap(),
vec![
Value(true),
Value(false),
Value(true),
Value(false),
Value(false),
Value(false),
Value(true),
Value(false),
Value(false),
Value(true),
Value(true),
Value(false),
Value(true),
Value(false),
NewIndex(0),
NewIndex(1)
],
vec![
Value(false),
Value(true),
Value(true),
Value(true),
Value(false),
Value(true),
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7),
Value(false),
Value(false)
]
),
assign_to_circuit_and_optimize(
&circuit,
(0..14).map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
nor(7,6)
nimpl(8,5)
xor(3,4)
nimpl(3,4)
nimpl(10,11)
nimpl(9,12):3
and(13,10)
nimpl(3,13)
nor(14,15)
xor(16,5)
and(13,2)
nimpl(2,13)
nor(18,19)
xor(20,4)
nor(20,4)
nor(21,22)
nimpl(17,23)
nor(16,5)
nor(24,25)
nimpl(8,26):2
xor(17,23)
nimpl(27,28)
nor(27,16)
nor(29,30)
xor(31,6)
nimpl(27,21)
nor(27,20)
nor(33,34)
xor(35,5)
and(13,1)
nimpl(1,13)
nor(37,38)
nimpl(27,39)
nor(27,39)
nor(40,41)
xor(42,4)
nor(42,4)
nor(43,44)
nimpl(36,45)
nor(35,5)
nor(46,47)
nimpl(32,48)
nor(31,6)
nor(49,50)
nor(51,7):1
xor(32,48)
nimpl(52,53)
nor(52,31)
nor(54,55)
xor(56,7)
xor(36,45)
nimpl(52,58)
nor(52,35)
nor(59,60)
xor(61,6)
nimpl(52,43)
nor(52,42)
nor(63,64)
xor(65,5)
and(13,0)
nimpl(0,13)
nor(67,68)
nimpl(27,69)
nor(27,69)
nor(70,71)
nimpl(52,72)
nor(52,72)
nor(73,74)
xor(75,4)
nor(75,4)
nor(76,77)
nimpl(66,78)
nor(65,5)
nor(79,80)
nimpl(62,81)
nor(61,6)
nor(82,83)
nimpl(57,84)
nor(56,7)
nor(85,86):0n
nor(87,76)
nimpl(87,75)
nor(88,89):4n
xor(66,78)
nor(87,91)
nimpl(87,65)
nor(92,93):5n
xor(62,81)
nor(87,95)
nimpl(87,61)
nor(96,97):6n
xor(57,84)
nor(87,99)
nimpl(87,56)
nor(100,101):7n
}(8)
"##,
)
.unwrap();
let inputv = 4 | (1 << 4);
assert_eq!(
(
Circuit::from_str("{ 0:0n:1 }(1)").unwrap(),
vec![
Value(false),
Value(false),
Value(true),
Value(false),
Value(true),
Value(false),
Value(false),
NewIndex(0)
],
vec![
Value(false),
Value(false),
NewIndex(0),
Value(false),
Value(false),
Value(false),
NewIndex(1),
Value(false)
]
),
assign_to_circuit_and_optimize(
&circuit,
(0..7).map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let inputv = 13 | (3 << 4);
assert_eq!(
(
Circuit::from_str("{ 0:0:1n:2n:3 }(1)").unwrap(),
vec![
Value(true),
Value(false),
Value(true),
Value(true),
Value(true),
Value(true),
Value(false),
NewIndex(0)
],
vec![
NewIndex(0),
Value(false),
NewIndex(1),
Value(false),
NewIndex(2),
NewIndex(3),
Value(false),
Value(false)
]
),
assign_to_circuit_and_optimize(
&circuit,
(0..7).map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##" {
0
1
2
3
4
5
6
7
and(0,4):0
and(0,5)
and(1,4)
xor(9,10):1
and(0,6)
and(1,5)
and(2,4)
xor(13,14)
xor(12,15)
and(9,10)
xor(16,17):2
and(0,7)
and(1,6)
xor(19,20)
and(2,5)
and(3,4)
xor(22,23)
xor(21,24)
and(13,14)
xor(25,26)
and(16,17)
and(12,15)
nor(28,29)
xor(27,30):3n
and(1,7)
and(2,6)
and(3,5)
xor(33,34)
xor(32,35)
and(22,23)
xor(36,37)
and(21,24)
and(19,20)
nor(39,40)
xor(38,41)
nimpl(27,30)
and(25,26)
nor(43,44)
xor(42,45):4
and(2,7)
and(3,6)
xor(47,48)
and(33,34)
xor(49,50)
and(36,37)
and(32,35)
nor(52,53)
xor(51,54)
nor(42,45)
nimpl(38,41)
nor(56,57)
xor(55,58):5
and(3,7)
and(49,50)
and(47,48)
nor(61,62)
xor(60,63)
nor(55,58)
nimpl(51,54)
nor(65,66)
xor(64,67):6
nor(64,67)
nimpl(60,63)
nor(69,70):7n
}(8)
"##,
)
.unwrap();
let inputv = 12 | (7 << 4);
let inputs_bits = 4;
let assigned_bits = 6;
assert_eq!(
(
Circuit::from_str(
r##" {
0:0
1:4n:5
xor(0,1):1
xor(0,1)
and(0,1)
xor(3,4):2n
nimpl(4,3)
nimpl(0,1)
nor(6,7):3n
}(2)
"##
)
.unwrap(),
vec![
NewIndex(0),
NewIndex(1),
Value(true),
Value(true),
Value(true),
Value(true),
Value(true),
Value(false)
],
vec![
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
Value(true),
Value(false)
]
),
assign_to_circuit_and_optimize(
&circuit,
(2 * inputs_bits - assigned_bits..2 * inputs_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
}
#[test]
fn test_assign_to_circuit_optimize_and_dedup_testi0() {
use OutputEntry::{NewIndex, Value};
let circuit = Circuit::<u32>::from_str(
r##" {
0
1
2
3
4
5
6
7
8
9
10
11
and(0,6):0
and(0,7)
and(1,6)
xor(13,14):1
and(0,8)
and(1,7)
and(2,6)
xor(17,18)
xor(16,19)
and(13,14)
xor(20,21):2
and(0,9)
and(1,8)
xor(23,24)
and(2,7)
and(3,6)
xor(26,27)
xor(25,28)
and(17,18)
xor(29,30)
and(20,21)
and(16,19)
nor(32,33)
xor(31,34):3n
and(0,10)
and(1,9)
and(2,8)
xor(37,38)
and(3,7)
and(4,6)
xor(40,41)
xor(39,42)
xor(36,43)
and(26,27)
xor(44,45)
and(25,28)
and(23,24)
nor(47,48)
xor(46,49)
nimpl(31,34)
and(29,30)
nor(51,52)
xor(50,53):4
and(0,11)
and(1,10)
and(2,9)
xor(56,57)
and(3,8)
xor(58,59)
and(4,7)
and(5,6)
xor(61,62)
xor(60,63)
and(40,41)
xor(64,65)
xor(55,66)
and(39,42)
and(37,38)
nor(68,69)
xor(67,70)
and(44,45)
and(36,43)
nor(72,73)
xor(71,74)
nor(50,53)
nimpl(46,49)
nor(76,77)
xor(75,78):5n
}(12)
"##,
)
.unwrap();
let inputs_bits = 6;
let assigned_bits = 8;
let inputv = 14 | (3 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0:0n
1
2
xor(0,1)
xor(0,3):1
and(0,1)
nor(3,5)
and(0,3)
xor(2,6)
xor(8,7):2
}(3)
"##
)
.unwrap(),
vec![
Value(false),
Value(true),
Value(true),
Value(true),
Value(false),
Value(false),
Value(true),
Value(true),
NewIndex(0),
NewIndex(1),
NewIndex(2),
Value(false)
],
vec![
Value(false),
Value(true),
Value(false),
NewIndex(0),
NewIndex(1),
NewIndex(2)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(0..assigned_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
and(0,8):0
and(0,9)
and(1,8)
xor(17,18):1
and(0,10)
and(1,9)
and(2,8)
xor(21,22)
xor(20,23)
and(17,18)
xor(24,25):2
and(0,11)
and(1,10)
xor(27,28)
and(2,9)
and(3,8)
xor(30,31)
xor(29,32)
and(21,22)
xor(33,34)
and(24,25)
and(20,23)
nor(36,37)
xor(35,38):3n
and(0,12)
and(1,11)
and(2,10)
xor(41,42)
and(3,9)
and(4,8)
xor(44,45)
xor(43,46)
xor(40,47)
and(30,31)
xor(48,49)
and(29,32)
and(27,28)
nor(51,52)
xor(50,53)
nimpl(35,38)
and(33,34)
nor(55,56)
xor(54,57):4
and(0,13)
and(1,12)
and(2,11)
xor(60,61)
and(3,10)
xor(62,63)
and(4,9)
and(5,8)
xor(65,66)
xor(64,67)
and(44,45)
xor(68,69)
xor(59,70)
and(43,46)
and(41,42)
nor(72,73)
xor(71,74)
and(48,49)
and(40,47)
nor(76,77)
xor(75,78)
nor(54,57)
nimpl(50,53)
nor(80,81)
xor(79,82):5n
and(0,14)
and(1,13)
xor(84,85)
and(2,12)
xor(86,87)
and(3,11)
and(4,10)
xor(89,90)
and(5,9)
and(6,8)
xor(92,93)
xor(91,94)
and(62,63)
and(60,61)
nor(96,97)
xor(95,98)
and(65,66)
xor(99,100)
xor(88,101)
and(68,69)
and(64,67)
nor(103,104)
xor(102,105)
nimpl(71,74)
and(59,70)
nor(107,108)
xor(106,109)
nimpl(79,82)
nor(75,78)
nor(111,112)
xor(110,113):6
and(0,15)
and(1,14)
xor(115,116)
and(2,13)
xor(117,118)
and(3,12)
and(4,11)
xor(120,121)
and(5,10)
xor(122,123)
and(6,9)
and(7,8)
xor(125,126)
xor(124,127)
and(92,93)
xor(128,129)
and(86,87)
and(84,85)
nor(131,132)
xor(130,133)
and(91,94)
and(89,90)
nor(135,136)
xor(134,137)
xor(119,138)
nimpl(100,99)
nimpl(95,98)
nor(140,141)
xor(139,142)
nor(102,105)
nimpl(88,101)
nor(144,145)
xor(143,146)
nor(110,113)
nimpl(106,109)
nor(148,149)
xor(147,150):7n
}(16)
"##,
)
.unwrap();
let inputs_bits = 8;
let assigned_bits = 14;
let inputv = 9 | (232 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0:0:2
1:1
xor(0,1):3n
and(0,1):4
}(2)
"##
)
.unwrap(),
vec![
NewIndex(0),
NewIndex(1),
Value(false),
Value(true),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(true),
Value(false),
Value(true),
Value(true),
Value(true)
],
vec![
Value(false),
Value(false),
Value(false),
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(2 * inputs_bits - assigned_bits..2 * inputs_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let inputv = 25 | (227 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0:0:5
1
xor(0,1):1:6n
and(0,1):7
xor(1,3):2
and(1,3):3n:4
}(2)
"##
)
.unwrap(),
vec![
NewIndex(0),
NewIndex(1),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(true)
],
vec![
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(2 * inputs_bits - assigned_bits..2 * inputs_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nor(19,18)
nimpl(20,17)
nimpl(21,16)
nimpl(22,15)
nimpl(23,14)
nimpl(24,13)
nimpl(25,12)
nimpl(26,11)
xor(9,10)
nimpl(9,10)
nimpl(28,29)
nimpl(27,30)
and(31,28)
nimpl(9,31)
nor(32,33)
xor(34,11)
and(31,8)
nimpl(8,31)
nor(36,37)
xor(38,10)
nor(38,10)
nor(39,40)
nimpl(35,41)
nor(34,11)
nor(42,43)
nimpl(26,44)
xor(35,41)
nimpl(45,46)
nor(45,34)
nor(47,48)
xor(49,12)
nimpl(45,39)
nor(45,38)
nor(51,52)
xor(53,11)
and(31,7)
nimpl(7,31)
nor(55,56)
nimpl(45,57)
nor(45,57)
nor(58,59)
xor(60,10)
nor(60,10)
nor(61,62)
nimpl(54,63)
nor(53,11)
nor(64,65)
nimpl(50,66)
nor(49,12)
nor(67,68)
nimpl(25,69)
xor(50,66)
nimpl(70,71)
nor(70,49)
nor(72,73)
xor(74,13)
xor(54,63)
nimpl(70,76)
nor(70,53)
nor(77,78)
xor(79,12)
nimpl(70,61)
nor(70,60)
nor(81,82)
xor(83,11)
and(31,6)
nimpl(6,31)
nor(85,86)
nimpl(45,87)
nor(45,87)
nor(88,89)
nimpl(70,90)
nor(70,90)
nor(91,92)
xor(93,10)
nor(93,10)
nor(94,95)
nimpl(84,96)
nor(83,11)
nor(97,98)
nimpl(80,99)
nor(79,12)
nor(100,101)
nimpl(75,102)
nor(74,13)
nor(103,104)
nimpl(24,105)
xor(75,102)
nimpl(106,107)
nor(106,74)
nor(108,109)
xor(110,14)
xor(80,99)
nimpl(106,112)
nor(106,79)
nor(113,114)
xor(115,13)
xor(84,96)
nimpl(106,117)
nor(106,83)
nor(118,119)
xor(120,12)
nimpl(106,94)
nor(106,93)
nor(122,123)
xor(124,11)
and(31,5)
nimpl(5,31)
nor(126,127)
nimpl(45,128)
nor(45,128)
nor(129,130)
nimpl(70,131)
nor(70,131)
nor(132,133)
nimpl(106,134)
nor(106,134)
nor(135,136)
xor(137,10)
nor(137,10)
nor(138,139)
nimpl(125,140)
nor(124,11)
nor(141,142)
nimpl(121,143)
nor(120,12)
nor(144,145)
nimpl(116,146)
nor(115,13)
nor(147,148)
nimpl(111,149)
nor(110,14)
nor(150,151)
nimpl(23,152)
xor(111,149)
nimpl(153,154)
nor(153,110)
nor(155,156)
xor(157,15)
xor(116,146)
nimpl(153,159)
nor(153,115)
nor(160,161)
xor(162,14)
xor(121,143)
nimpl(153,164)
nor(153,120)
nor(165,166)
xor(167,13)
xor(125,140)
nimpl(153,169)
nor(153,124)
nor(170,171)
xor(172,12)
nimpl(153,138)
nor(153,137)
nor(174,175)
xor(176,11)
and(31,4)
nimpl(4,31)
nor(178,179)
nimpl(45,180)
nor(45,180)
nor(181,182)
nimpl(70,183)
nor(70,183)
nor(184,185)
nimpl(106,186)
nor(106,186)
nor(187,188)
nimpl(153,189)
nor(153,189)
nor(190,191)
xor(192,10)
nor(192,10)
nor(193,194)
nimpl(177,195)
nor(176,11)
nor(196,197)
nimpl(173,198)
nor(172,12)
nor(199,200)
nimpl(168,201)
nor(167,13)
nor(202,203)
nimpl(163,204)
nor(162,14)
nor(205,206)
nimpl(158,207)
nor(157,15)
nor(208,209)
nimpl(22,210)
xor(158,207)
nimpl(211,212)
nor(211,157)
nor(213,214)
xor(215,16)
xor(163,204)
nimpl(211,217)
nor(211,162)
nor(218,219)
xor(220,15)
xor(168,201)
nimpl(211,222)
nor(211,167)
nor(223,224)
xor(225,14)
xor(173,198)
nimpl(211,227)
nor(211,172)
nor(228,229)
xor(230,13)
xor(177,195)
nimpl(211,232)
nor(211,176)
nor(233,234)
xor(235,12)
nimpl(211,193)
nor(211,192)
nor(237,238)
xor(239,11)
and(31,3)
nimpl(3,31)
nor(241,242)
nimpl(45,243)
nor(45,243)
nor(244,245)
nimpl(70,246)
nor(70,246)
nor(247,248)
nimpl(106,249)
nor(106,249)
nor(250,251)
nimpl(153,252)
nor(153,252)
nor(253,254)
nimpl(211,255)
nor(211,255)
nor(256,257)
xor(258,10)
nor(258,10)
nor(259,260)
nimpl(240,261)
nor(239,11)
nor(262,263)
nimpl(236,264)
nor(235,12)
nor(265,266)
nimpl(231,267)
nor(230,13)
nor(268,269)
nimpl(226,270)
nor(225,14)
nor(271,272)
nimpl(221,273)
nor(220,15)
nor(274,275)
nimpl(216,276)
nor(215,16)
nor(277,278)
nimpl(21,279)
xor(216,276)
nimpl(280,281)
nor(280,215)
nor(282,283)
xor(284,17)
xor(221,273)
nimpl(280,286)
nor(280,220)
nor(287,288)
xor(289,16)
xor(226,270)
nimpl(280,291)
nor(280,225)
nor(292,293)
xor(294,15)
xor(231,267)
nimpl(280,296)
nor(280,230)
nor(297,298)
xor(299,14)
xor(236,264)
nimpl(280,301)
nor(280,235)
nor(302,303)
xor(304,13)
xor(240,261)
nimpl(280,306)
nor(280,239)
nor(307,308)
xor(309,12)
nimpl(280,259)
nor(280,258)
nor(311,312)
xor(313,11)
and(31,2)
nimpl(2,31)
nor(315,316)
nimpl(45,317)
nor(45,317)
nor(318,319)
nimpl(70,320)
nor(70,320)
nor(321,322)
nimpl(106,323)
nor(106,323)
nor(324,325)
nimpl(153,326)
nor(153,326)
nor(327,328)
nimpl(211,329)
nor(211,329)
nor(330,331)
nimpl(280,332)
nor(280,332)
nor(333,334)
xor(335,10)
nor(335,10)
nor(336,337)
nimpl(314,338)
nor(313,11)
nor(339,340)
nimpl(310,341)
nor(309,12)
nor(342,343)
nimpl(305,344)
nor(304,13)
nor(345,346)
nimpl(300,347)
nor(299,14)
nor(348,349)
nimpl(295,350)
nor(294,15)
nor(351,352)
nimpl(290,353)
nor(289,16)
nor(354,355)
nimpl(285,356)
nor(284,17)
nor(357,358)
nimpl(20,359)
xor(285,356)
nimpl(360,361)
nor(360,284)
nor(362,363)
xor(364,18)
xor(290,353)
nimpl(360,366)
nor(360,289)
nor(367,368)
xor(369,17)
xor(295,350)
nimpl(360,371)
nor(360,294)
nor(372,373)
xor(374,16)
xor(300,347)
nimpl(360,376)
nor(360,299)
nor(377,378)
xor(379,15)
xor(305,344)
nimpl(360,381)
nor(360,304)
nor(382,383)
xor(384,14)
xor(310,341)
nimpl(360,386)
nor(360,309)
nor(387,388)
xor(389,13)
xor(314,338)
nimpl(360,391)
nor(360,313)
nor(392,393)
xor(394,12)
nimpl(360,336)
nor(360,335)
nor(396,397)
xor(398,11)
and(31,1)
nimpl(1,31)
nor(400,401)
nimpl(45,402)
nor(45,402)
nor(403,404)
nimpl(70,405)
nor(70,405)
nor(406,407)
nimpl(106,408)
nor(106,408)
nor(409,410)
nimpl(153,411)
nor(153,411)
nor(412,413)
nimpl(211,414)
nor(211,414)
nor(415,416)
nimpl(280,417)
nor(280,417)
nor(418,419)
nimpl(360,420)
nor(360,420)
nor(421,422)
xor(423,10)
nor(423,10)
nor(424,425)
nimpl(399,426)
nor(398,11)
nor(427,428)
nimpl(395,429)
nor(394,12)
nor(430,431)
nimpl(390,432)
nor(389,13)
nor(433,434)
nimpl(385,435)
nor(384,14)
nor(436,437)
nimpl(380,438)
nor(379,15)
nor(439,440)
nimpl(375,441)
nor(374,16)
nor(442,443)
nimpl(370,444)
nor(369,17)
nor(445,446)
nimpl(365,447)
nor(364,18)
nor(448,449)
nor(450,19)
xor(365,447)
nimpl(451,452)
nor(451,364)
nor(453,454)
xor(455,19)
xor(370,444)
nimpl(451,457)
nor(451,369)
nor(458,459)
xor(460,18)
xor(375,441)
nimpl(451,462)
nor(451,374)
nor(463,464)
xor(465,17)
xor(380,438)
nimpl(451,467)
nor(451,379)
nor(468,469)
xor(470,16)
xor(385,435)
nimpl(451,472)
nor(451,384)
nor(473,474)
xor(475,15)
xor(390,432)
nimpl(451,477)
nor(451,389)
nor(478,479)
xor(480,14)
xor(395,429)
nimpl(451,482)
nor(451,394)
nor(483,484)
xor(485,13)
xor(399,426)
nimpl(451,487)
nor(451,398)
nor(488,489)
xor(490,12)
nimpl(451,424)
nor(451,423)
nor(492,493)
xor(494,11)
and(31,0)
nimpl(0,31)
nor(496,497)
nimpl(45,498)
nor(45,498)
nor(499,500)
nimpl(70,501)
nor(70,501)
nor(502,503)
nimpl(106,504)
nor(106,504)
nor(505,506)
nimpl(153,507)
nor(153,507)
nor(508,509)
nimpl(211,510)
nor(211,510)
nor(511,512)
nimpl(280,513)
nor(280,513)
nor(514,515)
nimpl(360,516)
nor(360,516)
nor(517,518)
nimpl(451,519)
nor(451,519)
nor(520,521)
xor(522,10)
nor(522,10)
nor(523,524)
nimpl(495,525)
nor(494,11)
nor(526,527)
nimpl(491,528)
nor(490,12)
nor(529,530)
nimpl(486,531)
nor(485,13)
nor(532,533)
nimpl(481,534)
nor(480,14)
nor(535,536)
nimpl(476,537)
nor(475,15)
nor(538,539)
nimpl(471,540)
nor(470,16)
nor(541,542)
nimpl(466,543)
nor(465,17)
nor(544,545)
nimpl(461,546)
nor(460,18)
nor(547,548)
nimpl(456,549)
nor(455,19)
nor(550,551)
nor(552,523)
nimpl(552,522)
nor(553,554):0n
xor(495,525)
nor(552,556)
nimpl(552,494)
nor(557,558):1n
xor(491,528)
nor(552,560)
nimpl(552,490)
nor(561,562):2n
xor(486,531)
nor(552,564)
nimpl(552,485)
nor(565,566):3n
xor(481,534)
nor(552,568)
nimpl(552,480)
nor(569,570):4n
xor(476,537)
nor(552,572)
nimpl(552,475)
nor(573,574):5n
xor(471,540)
nor(552,576)
nimpl(552,470)
nor(577,578):6n
xor(466,543)
nor(552,580)
nimpl(552,465)
nor(581,582):7n
xor(461,546)
nor(552,584)
nimpl(552,460)
nor(585,586):8n
xor(456,549)
nor(552,588)
nimpl(552,455)
nor(589,590):9n
}(20)
"##,
)
.unwrap();
let inputs_bits = 10;
let assigned_bits = 17;
let inputv = 21 | (1 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0
1
2
nor(0,1)
nimpl(3,2)
and(0,4)
xor(1,5)
nor(0,4)
nimpl(7,6)
nimpl(5,1)
nor(8,9)
nor(2,10)
xor(6,7)
nimpl(11,12)
nimpl(5,11)
nor(13,14)
xor(2,15)
xor(0,4)
and(11,17)
xor(1,18)
and(4,11)
xor(0,20)
nor(4,11)
nor(11,22)
nor(20,22)
nimpl(20,0)
nimpl(21,25)
nor(19,26)
nimpl(18,1)
nor(27,28)
nimpl(16,29)
nor(2,15)
nor(30,31):0
nimpl(11,32)
and(11,32)
nor(33,34):1n
nor(24,32)
nimpl(32,24)
nor(36,37):2n
nimpl(20,32)
and(20,32)
nor(39,40):3n
nor(23,32)
nimpl(32,23)
nor(42,43):4n
nor(39,40):5n:6n
nimpl(21,32)
nor(40,46):7n
xor(19,26)
nimpl(48,32)
and(18,32)
nor(49,50):8n
xor(16,29)
nor(32,52)
nimpl(32,15)
nor(53,54):9n
}(3)
"##
)
.unwrap(),
vec![
Value(true),
Value(false),
Value(true),
Value(false),
Value(true),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(true),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
NewIndex(0),
NewIndex(1),
NewIndex(2)
],
vec![
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7),
NewIndex(8),
NewIndex(9)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(0..assigned_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nor(15,14)
nimpl(16,13)
nimpl(17,12)
nimpl(18,11)
nimpl(19,10)
nimpl(20,9)
xor(7,8)
nimpl(7,8)
nimpl(22,23)
nimpl(21,24)
and(25,22)
nimpl(7,25)
nor(26,27)
xor(28,9)
and(25,6)
nimpl(6,25)
nor(30,31)
xor(32,8)
nor(32,8)
nor(33,34)
nimpl(29,35)
nor(28,9)
nor(36,37)
nimpl(20,38)
xor(29,35)
nimpl(39,40)
nor(39,28)
nor(41,42)
xor(43,10)
nimpl(39,33)
nor(39,32)
nor(45,46)
xor(47,9)
and(25,5)
nimpl(5,25)
nor(49,50)
nimpl(39,51)
nor(39,51)
nor(52,53)
xor(54,8)
nor(54,8)
nor(55,56)
nimpl(48,57)
nor(47,9)
nor(58,59)
nimpl(44,60)
nor(43,10)
nor(61,62)
nimpl(19,63)
xor(44,60)
nimpl(64,65)
nor(64,43)
nor(66,67)
xor(68,11)
xor(48,57)
nimpl(64,70)
nor(64,47)
nor(71,72)
xor(73,10)
nimpl(64,55)
nor(64,54)
nor(75,76)
xor(77,9)
and(25,4)
nimpl(4,25)
nor(79,80)
nimpl(39,81)
nor(39,81)
nor(82,83)
nimpl(64,84)
nor(64,84)
nor(85,86)
xor(87,8)
nor(87,8)
nor(88,89)
nimpl(78,90)
nor(77,9)
nor(91,92)
nimpl(74,93)
nor(73,10)
nor(94,95)
nimpl(69,96)
nor(68,11)
nor(97,98)
nimpl(18,99)
xor(69,96)
nimpl(100,101)
nor(100,68)
nor(102,103)
xor(104,12)
xor(74,93)
nimpl(100,106)
nor(100,73)
nor(107,108)
xor(109,11)
xor(78,90)
nimpl(100,111)
nor(100,77)
nor(112,113)
xor(114,10)
nimpl(100,88)
nor(100,87)
nor(116,117)
xor(118,9)
and(25,3)
nimpl(3,25)
nor(120,121)
nimpl(39,122)
nor(39,122)
nor(123,124)
nimpl(64,125)
nor(64,125)
nor(126,127)
nimpl(100,128)
nor(100,128)
nor(129,130)
xor(131,8)
nor(131,8)
nor(132,133)
nimpl(119,134)
nor(118,9)
nor(135,136)
nimpl(115,137)
nor(114,10)
nor(138,139)
nimpl(110,140)
nor(109,11)
nor(141,142)
nimpl(105,143)
nor(104,12)
nor(144,145)
nimpl(17,146)
xor(105,143)
nimpl(147,148)
nor(147,104)
nor(149,150)
xor(151,13)
xor(110,140)
nimpl(147,153)
nor(147,109)
nor(154,155)
xor(156,12)
xor(115,137)
nimpl(147,158)
nor(147,114)
nor(159,160)
xor(161,11)
xor(119,134)
nimpl(147,163)
nor(147,118)
nor(164,165)
xor(166,10)
nimpl(147,132)
nor(147,131)
nor(168,169)
xor(170,9)
and(25,2)
nimpl(2,25)
nor(172,173)
nimpl(39,174)
nor(39,174)
nor(175,176)
nimpl(64,177)
nor(64,177)
nor(178,179)
nimpl(100,180)
nor(100,180)
nor(181,182)
nimpl(147,183)
nor(147,183)
nor(184,185)
xor(186,8)
nor(186,8)
nor(187,188)
nimpl(171,189)
nor(170,9)
nor(190,191)
nimpl(167,192)
nor(166,10)
nor(193,194)
nimpl(162,195)
nor(161,11)
nor(196,197)
nimpl(157,198)
nor(156,12)
nor(199,200)
nimpl(152,201)
nor(151,13)
nor(202,203)
nimpl(16,204)
xor(152,201)
nimpl(205,206)
nor(205,151)
nor(207,208)
xor(209,14)
xor(157,198)
nimpl(205,211)
nor(205,156)
nor(212,213)
xor(214,13)
xor(162,195)
nimpl(205,216)
nor(205,161)
nor(217,218)
xor(219,12)
xor(167,192)
nimpl(205,221)
nor(205,166)
nor(222,223)
xor(224,11)
xor(171,189)
nimpl(205,226)
nor(205,170)
nor(227,228)
xor(229,10)
nimpl(205,187)
nor(205,186)
nor(231,232)
xor(233,9)
and(25,1)
nimpl(1,25)
nor(235,236)
nimpl(39,237)
nor(39,237)
nor(238,239)
nimpl(64,240)
nor(64,240)
nor(241,242)
nimpl(100,243)
nor(100,243)
nor(244,245)
nimpl(147,246)
nor(147,246)
nor(247,248)
nimpl(205,249)
nor(205,249)
nor(250,251)
xor(252,8)
nor(252,8)
nor(253,254)
nimpl(234,255)
nor(233,9)
nor(256,257)
nimpl(230,258)
nor(229,10)
nor(259,260)
nimpl(225,261)
nor(224,11)
nor(262,263)
nimpl(220,264)
nor(219,12)
nor(265,266)
nimpl(215,267)
nor(214,13)
nor(268,269)
nimpl(210,270)
nor(209,14)
nor(271,272)
nor(273,15)
xor(210,270)
nimpl(274,275)
nor(274,209)
nor(276,277)
xor(278,15)
xor(215,267)
nimpl(274,280)
nor(274,214)
nor(281,282)
xor(283,14)
xor(220,264)
nimpl(274,285)
nor(274,219)
nor(286,287)
xor(288,13)
xor(225,261)
nimpl(274,290)
nor(274,224)
nor(291,292)
xor(293,12)
xor(230,258)
nimpl(274,295)
nor(274,229)
nor(296,297)
xor(298,11)
xor(234,255)
nimpl(274,300)
nor(274,233)
nor(301,302)
xor(303,10)
nimpl(274,253)
nor(274,252)
nor(305,306)
xor(307,9)
and(25,0)
nimpl(0,25)
nor(309,310)
nimpl(39,311)
nor(39,311)
nor(312,313)
nimpl(64,314)
nor(64,314)
nor(315,316)
nimpl(100,317)
nor(100,317)
nor(318,319)
nimpl(147,320)
nor(147,320)
nor(321,322)
nimpl(205,323)
nor(205,323)
nor(324,325)
nimpl(274,326)
nor(274,326)
nor(327,328)
xor(329,8)
nor(329,8)
nor(330,331)
nimpl(308,332)
nor(307,9)
nor(333,334)
nimpl(304,335)
nor(303,10)
nor(336,337)
nimpl(299,338)
nor(298,11)
nor(339,340)
nimpl(294,341)
nor(293,12)
nor(342,343)
nimpl(289,344)
nor(288,13)
nor(345,346)
nimpl(284,347)
nor(283,14)
nor(348,349)
nimpl(279,350)
nor(278,15)
nor(351,352)
nor(353,330)
nimpl(353,329)
nor(354,355):0n
xor(308,332)
nor(353,357)
nimpl(353,307)
nor(358,359):1n
xor(304,335)
nor(353,361)
nimpl(353,303)
nor(362,363):2n
xor(299,338)
nor(353,365)
nimpl(353,298)
nor(366,367):3n
xor(294,341)
nor(353,369)
nimpl(353,293)
nor(370,371):4n
xor(289,344)
nor(353,373)
nimpl(353,288)
nor(374,375):5n
xor(284,347)
nor(353,377)
nimpl(353,283)
nor(378,379):6n
xor(279,350)
nor(353,381)
nimpl(353,278)
nor(382,383):7n
}(16)
"##,
)
.unwrap();
let inputs_bits = 8;
let assigned_bits = 13;
let inputv = 126 | (9 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0
1
2
nor(0,1)
nimpl(3,2)
and(0,4)
xor(1,5)
xor(0,4)
nor(0,4)
nor(7,8)
nor(6,9)
nimpl(5,1)
nor(10,11)
nor(2,12)
xor(6,9)
and(13,14)
nimpl(5,13)
nor(15,16)
xor(2,17)
nimpl(13,7)
nor(4,13)
nor(19,20)
xor(1,21)
nimpl(13,4)
nor(20,23)
xor(0,24)
nimpl(24,13)
nimpl(24,26)
nor(24,27)
and(13,28)
nimpl(13,29)
nimpl(25,30)
nor(0,24)
nor(31,32)
nimpl(22,33)
nor(1,21)
nor(34,35)
nimpl(18,36)
nor(2,17)
nor(37,38):0n
nimpl(13,39)
nimpl(39,13)
nor(40,41):1n
xor(13,24)
nor(39,43)
nimpl(39,24)
nor(44,45):2n
xor(24,27)
nimpl(47,39)
nor(45,48):3n
xor(13,28)
nimpl(50,39)
nor(41,51):4n
xor(25,30)
nor(39,53)
nor(45,54):5n
xor(22,33)
nor(39,56)
nimpl(39,21)
nor(57,58):6n
xor(18,36)
nor(39,60)
nimpl(39,17)
nor(61,62):7n
}(3)
"##
)
.unwrap(),
vec![
Value(false),
Value(true),
Value(true),
Value(true),
Value(true),
Value(true),
Value(true),
Value(false),
Value(true),
Value(false),
Value(false),
Value(true),
Value(false),
NewIndex(0),
NewIndex(1),
NewIndex(2)
],
vec![
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(0..assigned_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let inputv = 126 | (73 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0
1
2
nor(0,1)
nimpl(3,2)
and(0,4)
xor(1,5)
xor(0,4)
nor(0,4)
nor(7,8)
nor(6,9)
nimpl(5,1)
nor(10,11)
nor(2,12)
xor(6,9)
and(13,14)
nimpl(5,13)
nor(15,16)
xor(2,17)
nimpl(13,7)
nor(4,13)
nor(19,20)
xor(1,21)
nimpl(13,4)
nor(20,23)
xor(0,24)
nimpl(24,13)
nimpl(24,26)
nor(24,27)
and(13,28)
nimpl(13,29)
nimpl(25,30)
nor(0,24)
nor(31,32)
nimpl(22,33)
nor(1,21)
nor(34,35)
nimpl(18,36)
nor(2,17)
nor(37,38):0n
nimpl(13,39)
nimpl(39,13)
nor(40,41):1n
xor(13,24)
nor(39,43)
nimpl(39,24)
nor(44,45):2n
xor(24,27)
nimpl(47,39)
nor(45,48):3n
xor(13,28)
nimpl(50,39)
nor(41,51):4n
xor(25,30)
nor(39,53)
nor(45,54):5n
xor(22,33)
nor(39,56)
nimpl(39,21)
nor(57,58):6n
xor(18,36)
nor(39,60)
nimpl(39,17)
nor(61,62):7n
}(3)
"##
)
.unwrap(),
vec![
Value(false),
Value(true),
Value(true),
Value(true),
Value(true),
Value(true),
Value(true),
Value(false),
Value(true),
Value(false),
Value(false),
Value(true),
Value(false),
NewIndex(0),
NewIndex(1),
NewIndex(2)
],
vec![
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(0..assigned_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
and(0,8):0
and(0,9)
and(1,8)
xor(17,18):1
and(0,10)
and(1,9)
and(2,8)
xor(21,22)
xor(20,23)
and(17,18)
xor(24,25):2
and(0,11)
and(1,10)
xor(27,28)
and(2,9)
and(3,8)
xor(30,31)
xor(29,32)
and(21,22)
xor(33,34)
and(24,25)
and(20,23)
nor(36,37)
xor(35,38):3n
and(0,12)
and(1,11)
and(2,10)
xor(41,42)
and(3,9)
and(4,8)
xor(44,45)
xor(43,46)
xor(40,47)
and(30,31)
xor(48,49)
and(29,32)
and(27,28)
nor(51,52)
xor(50,53)
nimpl(35,38)
and(33,34)
nor(55,56)
xor(54,57):4
and(0,13)
and(1,12)
and(2,11)
xor(60,61)
and(3,10)
xor(62,63)
and(4,9)
and(5,8)
xor(65,66)
xor(64,67)
and(44,45)
xor(68,69)
xor(59,70)
and(43,46)
and(41,42)
nor(72,73)
xor(71,74)
and(48,49)
and(40,47)
nor(76,77)
xor(75,78)
nor(54,57)
nimpl(50,53)
nor(80,81)
xor(79,82):5n
and(0,14)
and(1,13)
xor(84,85)
and(2,12)
xor(86,87)
and(3,11)
and(4,10)
xor(89,90)
and(5,9)
and(6,8)
xor(92,93)
xor(91,94)
and(62,63)
and(60,61)
nor(96,97)
xor(95,98)
and(65,66)
xor(99,100)
xor(88,101)
and(68,69)
and(64,67)
nor(103,104)
xor(102,105)
nimpl(71,74)
and(59,70)
nor(107,108)
xor(106,109)
nimpl(79,82)
nor(75,78)
nor(111,112)
xor(110,113):6
and(0,15)
and(1,14)
xor(115,116)
and(2,13)
xor(117,118)
and(3,12)
and(4,11)
xor(120,121)
and(5,10)
xor(122,123)
and(6,9)
and(7,8)
xor(125,126)
xor(124,127)
and(92,93)
xor(128,129)
and(86,87)
and(84,85)
nor(131,132)
xor(130,133)
and(91,94)
and(89,90)
nor(135,136)
xor(134,137)
xor(119,138)
nimpl(100,99)
nimpl(95,98)
nor(140,141)
xor(139,142)
nor(102,105)
nimpl(88,101)
nor(144,145)
xor(143,146)
nor(110,113)
nimpl(106,109)
nor(148,149)
xor(147,150):7n
}(16)
"##,
)
.unwrap();
let inputs_bits = 8;
let assigned_bits = 14;
let inputv = 24 | (227 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0:0:5
1
xor(0,1):1:6n
and(0,1):7
xor(1,3):2
and(1,3):3n:4
}(2)
"##
)
.unwrap(),
vec![
NewIndex(0),
NewIndex(1),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(true)
],
vec![
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(2 * inputs_bits - assigned_bits..2 * inputs_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
and(0,9):0
and(0,10)
and(1,9)
xor(19,20):1
and(0,11)
and(1,10)
and(2,9)
xor(23,24)
xor(22,25)
and(19,20)
xor(26,27):2
and(0,12)
and(1,11)
xor(29,30)
and(2,10)
and(3,9)
xor(32,33)
xor(31,34)
and(23,24)
xor(35,36)
and(26,27)
and(22,25)
nor(38,39)
xor(37,40):3n
and(0,13)
and(1,12)
and(2,11)
xor(43,44)
and(3,10)
and(4,9)
xor(46,47)
xor(45,48)
xor(42,49)
and(32,33)
xor(50,51)
and(31,34)
and(29,30)
nor(53,54)
xor(52,55)
nimpl(37,40)
and(35,36)
nor(57,58)
xor(56,59):4
and(0,14)
and(1,13)
and(2,12)
xor(62,63)
and(3,11)
xor(64,65)
and(4,10)
and(5,9)
xor(67,68)
xor(66,69)
and(46,47)
xor(70,71)
xor(61,72)
and(45,48)
and(43,44)
nor(74,75)
xor(73,76)
and(50,51)
and(42,49)
nor(78,79)
xor(77,80)
nor(56,59)
nimpl(52,55)
nor(82,83)
xor(81,84):5n
and(0,15)
and(1,14)
xor(86,87)
and(2,13)
xor(88,89)
and(3,12)
and(4,11)
xor(91,92)
and(5,10)
and(6,9)
xor(94,95)
xor(93,96)
and(64,65)
and(62,63)
nor(98,99)
xor(97,100)
and(67,68)
xor(101,102)
xor(90,103)
and(70,71)
and(66,69)
nor(105,106)
xor(104,107)
nimpl(73,76)
and(61,72)
nor(109,110)
xor(108,111)
nimpl(81,84)
nor(77,80)
nor(113,114)
xor(112,115):6
and(0,16)
and(1,15)
xor(117,118)
and(2,14)
xor(119,120)
and(3,13)
and(4,12)
xor(122,123)
and(5,11)
xor(124,125)
and(6,10)
and(7,9)
xor(127,128)
xor(126,129)
and(94,95)
xor(130,131)
and(88,89)
and(86,87)
nor(133,134)
xor(132,135)
and(93,96)
and(91,92)
nor(137,138)
xor(136,139)
xor(121,140)
nimpl(102,101)
nimpl(97,100)
nor(142,143)
xor(141,144)
nor(104,107)
nimpl(90,103)
nor(146,147)
xor(145,148)
nor(112,115)
nimpl(108,111)
nor(150,151)
xor(149,152):7n
and(0,17)
and(1,16)
and(2,15)
xor(155,156)
and(3,14)
xor(157,158)
xor(154,159)
and(4,13)
and(5,12)
xor(161,162)
and(6,11)
xor(163,164)
xor(160,165)
and(7,10)
and(8,9)
xor(167,168)
and(124,125)
and(122,123)
nor(170,171)
xor(169,172)
and(127,128)
xor(173,174)
and(119,120)
and(117,118)
nor(176,177)
xor(175,178)
and(130,131)
and(126,129)
nor(180,181)
xor(179,182)
xor(166,183)
nor(136,139)
nimpl(132,135)
nor(185,186)
xor(184,187)
nimpl(141,144)
and(121,140)
nor(189,190)
xor(188,191)
nimpl(149,152)
nor(145,148)
nor(193,194)
xor(192,195):8
}(18)
"##,
)
.unwrap();
let inputs_bits = 9;
let assigned_bits = 16;
let inputv = 24 | (454 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0:0:5
1
xor(0,1):1:6n
and(0,1):7
xor(1,3):2
and(1,3):3n:4
}(2)
"##
)
.unwrap(),
vec![
NewIndex(0),
NewIndex(1),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(true)
],
vec![
Value(false),
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(2 * inputs_bits - assigned_bits..2 * inputs_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
let circuit = Circuit::<u32>::from_str(
r##"{
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
and(0,10):0
and(0,11)
and(1,10)
xor(21,22):1
and(0,12)
and(1,11)
and(2,10)
xor(25,26)
xor(24,27)
and(21,22)
xor(28,29):2
and(0,13)
and(1,12)
xor(31,32)
and(2,11)
and(3,10)
xor(34,35)
xor(33,36)
and(25,26)
xor(37,38)
and(28,29)
and(24,27)
nor(40,41)
xor(39,42):3n
and(0,14)
and(1,13)
and(2,12)
xor(45,46)
and(3,11)
and(4,10)
xor(48,49)
xor(47,50)
xor(44,51)
and(34,35)
xor(52,53)
and(33,36)
and(31,32)
nor(55,56)
xor(54,57)
nimpl(39,42)
and(37,38)
nor(59,60)
xor(58,61):4
and(0,15)
and(1,14)
and(2,13)
xor(64,65)
and(3,12)
xor(66,67)
and(4,11)
and(5,10)
xor(69,70)
xor(68,71)
and(48,49)
xor(72,73)
xor(63,74)
and(47,50)
and(45,46)
nor(76,77)
xor(75,78)
and(52,53)
and(44,51)
nor(80,81)
xor(79,82)
nor(58,61)
nimpl(54,57)
nor(84,85)
xor(83,86):5n
and(0,16)
and(1,15)
xor(88,89)
and(2,14)
xor(90,91)
and(3,13)
and(4,12)
xor(93,94)
and(5,11)
and(6,10)
xor(96,97)
xor(95,98)
and(66,67)
and(64,65)
nor(100,101)
xor(99,102)
and(69,70)
xor(103,104)
xor(92,105)
and(72,73)
and(68,71)
nor(107,108)
xor(106,109)
nimpl(75,78)
and(63,74)
nor(111,112)
xor(110,113)
nimpl(83,86)
nor(79,82)
nor(115,116)
xor(114,117):6
and(0,17)
and(1,16)
xor(119,120)
and(2,15)
xor(121,122)
and(3,14)
and(4,13)
xor(124,125)
and(5,12)
xor(126,127)
and(6,11)
and(7,10)
xor(129,130)
xor(128,131)
and(96,97)
xor(132,133)
and(90,91)
and(88,89)
nor(135,136)
xor(134,137)
and(95,98)
and(93,94)
nor(139,140)
xor(138,141)
xor(123,142)
nimpl(104,103)
nimpl(99,102)
nor(144,145)
xor(143,146)
nor(106,109)
nimpl(92,105)
nor(148,149)
xor(147,150)
nor(114,117)
nimpl(110,113)
nor(152,153)
xor(151,154):7n
and(0,18)
and(1,17)
and(2,16)
xor(157,158)
and(3,15)
xor(159,160)
xor(156,161)
and(4,14)
and(5,13)
xor(163,164)
and(6,12)
xor(165,166)
xor(162,167)
and(7,11)
and(8,10)
xor(169,170)
and(126,127)
and(124,125)
nor(172,173)
xor(171,174)
and(129,130)
xor(175,176)
and(121,122)
and(119,120)
nor(178,179)
xor(177,180)
and(132,133)
and(128,131)
nor(182,183)
xor(181,184)
xor(168,185)
nor(138,141)
nimpl(134,137)
nor(187,188)
xor(186,189)
nimpl(143,146)
and(123,142)
nor(191,192)
xor(190,193)
nimpl(151,154)
nor(147,150)
nor(195,196)
xor(194,197):8
and(0,19)
and(1,18)
xor(199,200)
and(2,17)
xor(201,202)
and(3,16)
and(4,15)
xor(204,205)
and(5,14)
xor(206,207)
xor(203,208)
and(6,13)
and(7,12)
xor(210,211)
and(8,11)
and(9,10)
xor(213,214)
xor(212,215)
xor(209,216)
and(159,160)
and(157,158)
nor(218,219)
and(165,166)
and(163,164)
nor(221,222)
xor(220,223)
and(169,170)
xor(224,225)
and(162,167)
and(156,161)
nor(227,228)
xor(226,229)
nimpl(176,175)
nimpl(171,174)
nor(231,232)
xor(230,233)
xor(217,234)
nimpl(181,184)
nor(177,180)
nor(236,237)
xor(235,238)
nor(186,189)
nimpl(168,185)
nor(240,241)
xor(239,242)
nor(194,197)
nimpl(190,193)
nor(244,245)
xor(243,246):9n
}(20)
"##,
)
.unwrap();
let inputs_bits = 10;
let assigned_bits = 18;
let inputv = 24 | (908 << inputs_bits);
assert_eq!(
(
Circuit::from_str(
r##"{
0:0:5
1
xor(0,1):1:6n
and(0,1):7
xor(1,3):2
and(1,3):3n:4
}(2)
"##
)
.unwrap(),
vec![
NewIndex(0),
NewIndex(1),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(false),
Value(false),
Value(false),
Value(true),
Value(true),
Value(true)
],
vec![
Value(false),
Value(false),
NewIndex(0),
NewIndex(1),
NewIndex(2),
NewIndex(3),
NewIndex(4),
NewIndex(5),
NewIndex(6),
NewIndex(7)
]
),
assign_to_circuit_optimize_and_dedup(
&circuit,
(2 * inputs_bits - assigned_bits..2 * inputs_bits)
.map(|b| (u32::try_from(b).unwrap(), ((inputv >> (b & 31)) & 1) != 0)),
false
)
);
}