1pub trait LogicGate {
3 fn get_result(&self) -> Option<bool>;
4}
5
6
7
8#[derive(PartialEq)]
17pub struct Nand<'a> {
18 pub input1: &'a Option<bool>,
19 pub input2: &'a Option<bool>,
20}
21
22
23impl<'a> LogicGate for Nand<'a> {
24
25 fn get_result(&self) -> Option<bool> {
26 if *self.input1 == Some(true){
27 if *self.input2 == Some(true) {
28 return Some(false);
29 }
30 }
31 Some(true)
32 }
33}
34
35pub struct Not<'a> {
47 pub input: &'a Option<bool>,
48}
49
50
51impl<'a> LogicGate for Not<'a> {
52 fn get_result(&self) -> Option<bool> {
53 let a = Nand{input1: &self.input, input2: &self.input};
54 a.get_result()
55 }
56}
57pub struct Or<'a> {
69 pub input1: &'a Option<bool>,
70 pub input2: &'a Option<bool>,
71}
72
73impl<'a> LogicGate for Or<'a> {
74 fn get_result(&self) -> Option<bool> {
75 let a = Nand{input1: self.input1, input2: self.input1};
76 let b = Nand{input1: self.input2, input2: self.input2};
77 let c = Nand{input1: &a.get_result(),input2: &b.get_result()};
78 c.get_result()
79 }
80}
81
82pub struct Nor<'a>{
94 pub input1: &'a Option<bool>,
95 pub input2: &'a Option<bool>,
96}
97
98impl<'a> LogicGate for Nor<'a> {
99 fn get_result(&self) -> Option<bool> {
100 let a = Nand{input1: self.input1, input2: self.input1};
101 let b = Nand{input1: self.input2, input2: self.input2};
102 let c = Nand{input1: &a.get_result(),input2: &b.get_result()};
103 let d = Nand{input1: &c.get_result(),input2: &c.get_result()};
104 d.get_result()
105 }
106}
107pub struct And<'a> {
119 pub input1: &'a Option<bool>,
120 pub input2: &'a Option<bool>,
121}
122
123impl<'a> LogicGate for And<'a> {
124 fn get_result(&self) -> Option<bool> {
125 let a = Nand{input1: self.input1, input2: self.input2};
126 let b = Nand{input1: &a.get_result(), input2: &a.get_result()};
127 b.get_result()
128 }
129}
130pub struct HighLevel{
139}
140impl LogicGate for HighLevel {
141 fn get_result(&self) -> Option<bool> {
142 Some(true)
143 }
144}
145
146pub struct LowLevel{
155}
156impl LogicGate for LowLevel {
157 fn get_result(&self) -> Option<bool> {
158 Some(false)
159 }
160}
161
162pub struct Xor<'a>{
175 pub input1: &'a Option<bool>,
176 pub input2: &'a Option<bool>,
177}
178impl<'a> LogicGate for Xor<'a>{
179 fn get_result(&self) ->Option<bool> {
180 let a:And = And{input1:self.input1,input2:self.input2};
181 let b:Nor = Nor{input1:self.input1,input2:self.input2};
182 let c:Nor = Nor{input1:&a.get_result(),input2:&b.get_result()};
183 c.get_result()
184 }
185}
186
187
188pub struct ThreeOr<'a>{
203 pub input1: &'a Option<bool>,
204 pub input2: &'a Option<bool>,
205 pub input3: &'a Option<bool>,
206}
207
208impl<'a> LogicGate for ThreeOr<'a>{
209 fn get_result(&self) ->Option<bool> {
210 let a:Or = Or{input1:self.input1,input2:self.input2};
211 let b:Or = Or{input1:self.input2,input2:self.input3};
212 let c:Or = Or{input1:&a.get_result(),input2:&b.get_result()};
213 c.get_result()
214 }
215}
216
217
218pub struct ThreeAnd<'a>{
235 pub input1: &'a Option<bool>,
236 pub input2: &'a Option<bool>,
237 pub input3: &'a Option<bool>,
238}
239
240impl<'a> LogicGate for ThreeAnd<'a>{
241 fn get_result(&self) ->Option<bool> {
242 let a:And = And{input1:self.input1,input2:self.input2};
243 let b:And = And{input1:self.input2,input2:self.input3};
244 let c:And = And{input1:&a.get_result(),input2:&b.get_result()};
245 c.get_result()
246 }
247}
248pub struct Xnor<'a>{
262 pub input1: &'a Option<bool>,
263 pub input2: &'a Option<bool>,
264}
265
266impl<'a> LogicGate for Xnor<'a>{
267 fn get_result(&self) ->Option<bool> {
268 let a:Xor = Xor{input1:self.input1,input2:self.input2};
269 let b:Not = Not{input: &a.get_result()};
270 b.get_result()
271 }
272}
273
274use std::time::Duration;
275pub struct DelayLine<'a> {
285 pub delay: u64,
287 pub input: &'a Option<bool>,
288}
289
290impl<'a> DelayLine<'a> {
291 pub fn get_result(&self) -> Option<bool> {
292 std::thread::sleep(Duration::from_millis(self.delay));
293 *self.input
294 }
295}
296
297pub struct HalfAdder<'a> {
308 pub input1: &'a Option<bool>,
309 pub input2: &'a Option<bool>,
310}
311
312
313
314impl<'a> HalfAdder<'a>{
315 pub fn get_result(&self) -> (Option<bool>,Option<bool>) {
317 let a:Xor = Xor{input1: self.input1,input2:self.input2};
318 let b:And = And{input1: self.input1,input2:self.input2};
319 (a.get_result(),b.get_result())
320 }
321}
322
323pub struct FullAdder<'a> {
337 pub input1: &'a Option<bool>,
338 pub input2: &'a Option<bool>,
339 pub input3: &'a Option<bool>,
340}
341
342impl<'a> FullAdder<'a> {
343 pub fn get_result(&self) ->(Option<bool>,Option<bool>) {
345 let a: Xor = Xor{input1: self.input1, input2: self.input2};
346 let b: And = And{input1: self.input1, input2: self.input2};
347 let c: Xor = Xor{input1: &a.get_result(), input2: self.input3};
348 let d: And = And{input1: &a.get_result(), input2: self.input3};
349 let e: Or = Or{input1: &b.get_result(),input2: &d.get_result()};
350 (c.get_result(),e.get_result())
351 }
352}
353pub struct Switch<'a> {
362 pub switch: &'a Option<bool>,
363 pub input: &'a Option<bool>,
364}
365
366impl<'a> LogicGate for Switch<'a> {
367 fn get_result(&self) -> Option<bool> {
368 if *self.switch == Some(true) {
369 return *self.input;
370 }
371 None
372 }
373}
374
375pub struct EightSwitch<'a> {
384 pub switch: &'a Option<bool>,
385 pub input: i32,
386}
387
388impl<'a> EightSwitch<'a> {
389 fn get_result(&self) -> Option<i32> {
390 if *self.switch == Some(true) {
391 return Some(self.input);
392 }
393 None
394 }
395}
396
397pub struct EightBitSplitter{
409 pub input: i32,
410}
411
412impl EightBitSplitter {
413 pub fn get_result(&self) ->(Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>,Option<bool>) {
414 let bit1 = (self.input & 1) != 0;
415 let bit2 = (self.input & 2) != 0;
416 let bit3 = (self.input & 4) != 0;
417 let bit4 = (self.input & 8) != 0;
418 let bit5 = (self.input & 16) != 0;
419 let bit6 = (self.input & 32) != 0;
420 let bit7 = (self.input & 64) != 0;
421 let bit8 = (self.input & 128) != 0;
422
423 (Some(bit1), Some(bit2), Some(bit3), Some(bit4), Some(bit5), Some(bit6), Some(bit7),Some(bit8))
424 }
425}
426
427
428pub struct EightBitMux<'a> {
438 pub input1: &'a Option<bool>,
439 pub input2: &'a Option<bool>,
440 pub input3: &'a Option<bool>,
441 pub input4: &'a Option<bool>,
442 pub input5: &'a Option<bool>,
443 pub input6: &'a Option<bool>,
444 pub input7: &'a Option<bool>,
445 pub input8: &'a Option<bool>,
446}
447
448impl<'a> EightBitMux<'a> {
449 pub fn get_result(&self) -> i32 {
450 let result = (self.input8.unwrap_or(false) as i32) << 7 |
451 (self.input7.unwrap_or(false) as i32) << 6 |
452 (self.input6.unwrap_or(false) as i32) << 5 |
453 (self.input5.unwrap_or(false) as i32) << 4 |
454 (self.input4.unwrap_or(false) as i32) << 3 |
455 (self.input3.unwrap_or(false) as i32) << 2 |
456 (self.input2.unwrap_or(false) as i32) << 1 |
457 (self.input1.unwrap_or(false) as i32);
458 result
459 }
460}
461
462pub struct EightBitAdder<'a>{
485 pub input1: &'a Option<bool>,
486 pub input2: i32,
487 pub input3: i32,
488}
489
490impl<'a> EightBitAdder<'a> {
491 pub fn get_result(&self) -> (i32, Option<bool>) {
494 let splitter_one = EightBitSplitter { input: self.input2 }.get_result();
496 let splitter_two = EightBitSplitter { input: self.input3 }.get_result();
497 let adder_one = FullAdder { input1: self.input1, input2: & splitter_one.0, input3: & splitter_two.0 }.get_result();
499 let adder_two = FullAdder { input1: & adder_one.1, input2: & splitter_one.1, input3: & splitter_two.1 }.get_result();
500 let adder_three = FullAdder { input1: & adder_two.1, input2: & splitter_one.2, input3: & splitter_two.2 }.get_result();
501 let adder_four = FullAdder { input1: & adder_three.1, input2: & splitter_one.3, input3: & splitter_two.3 }.get_result();
502 let adder_five = FullAdder { input1: & adder_four.1, input2: & splitter_one.4, input3: & splitter_two.4 }.get_result();
503 let adder_six = FullAdder { input1: & adder_five.1, input2: & splitter_one.5, input3: & splitter_two.5 }.get_result();
504 let adder_seven = FullAdder { input1: & adder_six.1, input2: & splitter_one.6, input3: & splitter_two.6 }.get_result();
505 let adder_eight = FullAdder { input1: & adder_seven.1, input2: & splitter_one.7, input3: & splitter_two.7 }.get_result();
506 let selection = EightBitMux{input1:& adder_one.0, input2:& adder_two.0, input3:& adder_three.0, input4:& adder_four.0, input5:& adder_five.0, input6:& adder_six.0, input7:& adder_seven.0, input8:& adder_eight.0 }.get_result();
508
509 (selection, adder_eight.1)
511 }
512}
513
514pub struct EightBitNot{
522 pub input: i32,
523}
524
525impl EightBitNot {
526 pub fn get_result(&self) -> i32 {
527 let a = EightBitSplitter{input: self.input}.get_result();
528 let b = Not{input:& a.0}.get_result();
529 let c = Not{input:& a.1}.get_result();
530 let d = Not{input:& a.2}.get_result();
531 let e = Not{input:& a.3}.get_result();
532 let f = Not{input:& a.4}.get_result();
533 let g = Not{input:& a.5}.get_result();
534 let h = Not{input:& a.6}.get_result();
535 let i = Not{input:& a.7}.get_result();
536 EightBitMux{input1:& b,input2:& c,input3:& d,input4:& e,input5:& f,input6:& g,input7:& h,input8:& i}.get_result()
537 }
538}
539
540pub struct EightBitOr{
548 pub input1: i32,
549 pub input2: i32,
550}
551
552impl EightBitOr {
553 pub fn get_result(&self) -> i32 {
554 let a = EightBitSplitter{input: self.input1}.get_result();
555 let b = EightBitSplitter{input: self.input2}.get_result();
556 let c = Or{input1:& a.0,input2:& b.0}.get_result();
557 let d = Or{input1:& a.1,input2:& b.1}.get_result();
558 let e = Or{input1:& a.2,input2:& b.2}.get_result();
559 let f = Or{input1:& a.3,input2:& b.3}.get_result();
560 let g = Or{input1:& a.4,input2:& b.4}.get_result();
561 let h = Or{input1:& a.5,input2:& b.5}.get_result();
562 let i = Or{input1:& a.6,input2:& b.6}.get_result();
563 let j = Or{input1:& a.7,input2:& b.7}.get_result();
564 EightBitMux{input1:& c,input2: & d,input3:& e,input4:& f,input5:& g,input6:& h,input7:& i,input8:& j}.get_result()
565 }
566}
567
568
569pub struct DataSelector<'a>{
580 pub input1: &'a Option<bool>,
581 pub input2: i32,
582 pub input3: i32,
583}
584
585impl<'a> DataSelector<'a>{
586 pub fn get_result(&self) -> i32 {
587 if *self.input1 ==Some(true) {
588 return self.input3;
589 }
590 self.input2
591 }
592}