OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / lib / bitvector / t / 15________add.t
1 #!perl -w
2
3 use strict;
4 no strict "vars";
5
6 use Bit::Vector;
7
8 # ======================================================================
9 #   $carry_out = $vector1->add($vector2,$vector3,$carry_in);
10 # ======================================================================
11
12 print "1..1001\n";
13
14 $n = 1;
15
16 $result0{'FE'}{'FE'} = 'FC'; $carry0{'FE'}{'FE'} = 1;
17 $result0{'FE'}{'FF'} = 'FD'; $carry0{'FE'}{'FF'} = 1;
18 $result0{'FE'}{'00'} = 'FE'; $carry0{'FE'}{'00'} = 0;
19 $result0{'FE'}{'01'} = 'FF'; $carry0{'FE'}{'01'} = 0;
20 $result0{'FE'}{'02'} = '00'; $carry0{'FE'}{'02'} = 1;
21
22 $result0{'FF'}{'FE'} = 'FD'; $carry0{'FF'}{'FE'} = 1;
23 $result0{'FF'}{'FF'} = 'FE'; $carry0{'FF'}{'FF'} = 1;
24 $result0{'FF'}{'00'} = 'FF'; $carry0{'FF'}{'00'} = 0;
25 $result0{'FF'}{'01'} = '00'; $carry0{'FF'}{'01'} = 1;
26 $result0{'FF'}{'02'} = '01'; $carry0{'FF'}{'02'} = 1;
27
28 $result0{'00'}{'FE'} = 'FE'; $carry0{'00'}{'FE'} = 0;
29 $result0{'00'}{'FF'} = 'FF'; $carry0{'00'}{'FF'} = 0;
30 $result0{'00'}{'00'} = '00'; $carry0{'00'}{'00'} = 0;
31 $result0{'00'}{'01'} = '01'; $carry0{'00'}{'01'} = 0;
32 $result0{'00'}{'02'} = '02'; $carry0{'00'}{'02'} = 0;
33
34 $result0{'01'}{'FE'} = 'FF'; $carry0{'01'}{'FE'} = 0;
35 $result0{'01'}{'FF'} = '00'; $carry0{'01'}{'FF'} = 1;
36 $result0{'01'}{'00'} = '01'; $carry0{'01'}{'00'} = 0;
37 $result0{'01'}{'01'} = '02'; $carry0{'01'}{'01'} = 0;
38 $result0{'01'}{'02'} = '03'; $carry0{'01'}{'02'} = 0;
39
40 $result0{'02'}{'FE'} = '00'; $carry0{'02'}{'FE'} = 1;
41 $result0{'02'}{'FF'} = '01'; $carry0{'02'}{'FF'} = 1;
42 $result0{'02'}{'00'} = '02'; $carry0{'02'}{'00'} = 0;
43 $result0{'02'}{'01'} = '03'; $carry0{'02'}{'01'} = 0;
44 $result0{'02'}{'02'} = '04'; $carry0{'02'}{'02'} = 0;
45
46 $result1{'FE'}{'FE'} = 'FD'; $carry1{'FE'}{'FE'} = 1;
47 $result1{'FE'}{'FF'} = 'FE'; $carry1{'FE'}{'FF'} = 1;
48 $result1{'FE'}{'00'} = 'FF'; $carry1{'FE'}{'00'} = 0;
49 $result1{'FE'}{'01'} = '00'; $carry1{'FE'}{'01'} = 1;
50 $result1{'FE'}{'02'} = '01'; $carry1{'FE'}{'02'} = 1;
51
52 $result1{'FF'}{'FE'} = 'FE'; $carry1{'FF'}{'FE'} = 1;
53 $result1{'FF'}{'FF'} = 'FF'; $carry1{'FF'}{'FF'} = 1;
54 $result1{'FF'}{'00'} = '00'; $carry1{'FF'}{'00'} = 1;
55 $result1{'FF'}{'01'} = '01'; $carry1{'FF'}{'01'} = 1;
56 $result1{'FF'}{'02'} = '02'; $carry1{'FF'}{'02'} = 1;
57
58 $result1{'00'}{'FE'} = 'FF'; $carry1{'00'}{'FE'} = 0;
59 $result1{'00'}{'FF'} = '00'; $carry1{'00'}{'FF'} = 1;
60 $result1{'00'}{'00'} = '01'; $carry1{'00'}{'00'} = 0;
61 $result1{'00'}{'01'} = '02'; $carry1{'00'}{'01'} = 0;
62 $result1{'00'}{'02'} = '03'; $carry1{'00'}{'02'} = 0;
63
64 $result1{'01'}{'FE'} = '00'; $carry1{'01'}{'FE'} = 1;
65 $result1{'01'}{'FF'} = '01'; $carry1{'01'}{'FF'} = 1;
66 $result1{'01'}{'00'} = '02'; $carry1{'01'}{'00'} = 0;
67 $result1{'01'}{'01'} = '03'; $carry1{'01'}{'01'} = 0;
68 $result1{'01'}{'02'} = '04'; $carry1{'01'}{'02'} = 0;
69
70 $result1{'02'}{'FE'} = '01'; $carry1{'02'}{'FE'} = 1;
71 $result1{'02'}{'FF'} = '02'; $carry1{'02'}{'FF'} = 1;
72 $result1{'02'}{'00'} = '03'; $carry1{'02'}{'00'} = 0;
73 $result1{'02'}{'01'} = '04'; $carry1{'02'}{'01'} = 0;
74 $result1{'02'}{'02'} = '05'; $carry1{'02'}{'02'} = 0;
75
76 foreach $bits (31, 32, 33, 63, 64, 65, 127, 128, 129, 997)
77 {
78     $vec0 = Bit::Vector->new($bits);
79     $vec1 = Bit::Vector->new($bits);
80     $vec2 = Bit::Vector->new($bits);
81     $vec3 = Bit::Vector->new($bits);
82
83     foreach $arg1 (sort hexadecimal (keys %result0))
84     {
85         foreach $arg2 (sort hexadecimal (keys %{$result0{$arg1}}))
86         {
87 #           print "add '$arg1' + '$arg2'\n";
88             $vec1->from_Hex(convert($arg1));
89             $vec2->from_Hex(convert($arg2));
90             $vec3->from_Hex(convert($result0{$arg1}{$arg2}));
91             $carry3 =                   $carry0{$arg1}{$arg2};
92             $carry0 = $vec0->add($vec1,$vec2,0);
93 #           print "Result:    '", $vec0->to_Hex(), "' $carry0\n";
94 #           print "Should be: '", $vec3->to_Hex(), "' $carry3\n";
95             if ($vec0->equal($vec3))
96             {print "ok $n\n";} else {print "not ok $n\n";}
97             $n++;
98             if ($carry0 == $carry3)
99             {print "ok $n\n";} else {print "not ok $n\n";}
100             $n++;
101         }
102     }
103
104     foreach $arg1 (sort hexadecimal (keys %result0))
105     {
106         foreach $arg2 (sort hexadecimal (keys %{$result0{$arg1}}))
107         {
108 #           print "add '$arg1' + '$arg2' + 1\n";
109             $vec1->from_Hex(convert($arg1));
110             $vec2->from_Hex(convert($arg2));
111             $vec3->from_Hex(convert($result1{$arg1}{$arg2}));
112             $carry3 =                   $carry1{$arg1}{$arg2};
113             $carry0 = $vec0->add($vec1,$vec2,1);
114 #           print "Result:    '", $vec0->to_Hex(), "' $carry0\n";
115 #           print "Should be: '", $vec3->to_Hex(), "' $carry3\n";
116             if ($vec0->equal($vec3))
117             {print "ok $n\n";} else {print "not ok $n\n";}
118             $n++;
119             if ($carry0 == $carry3)
120             {print "ok $n\n";} else {print "not ok $n\n";}
121             $n++;
122         }
123     }
124 }
125
126 $vec = Bit::Vector->new(1024);
127 $vec->add($vec,$vec,5);
128 $vec->bit_flip(0);
129 if ($vec->is_empty())
130 {print "ok $n\n";} else {print "not ok $n\n";}
131 $n++;
132
133 exit;
134
135 sub hexadecimal
136 {
137     my($x,$y) = (hex($a),hex($b));
138
139     if ($x > 127) { $x -= 256; }
140     if ($y > 127) { $y -= 256; }
141
142     return( $x <=> $y );
143 }
144
145 sub convert
146 {
147     my($hex) = shift;
148     my($dec) = hex($hex);
149     my($len);
150
151     $len = int($bits / 4);
152     if ($len * 4 < $bits) { $len++; }
153     $len -= 2;
154
155     if ($dec > 127) { return( ('F' x $len) . $hex ); }
156     else            { return( ('0' x $len) . $hex ); }
157 }
158
159 __END__
160