sciforge_lib/physics/electronics/
digital.rs1pub fn and_gate(a: bool, b: bool) -> bool {
2 a && b
3}
4pub fn or_gate(a: bool, b: bool) -> bool {
5 a || b
6}
7pub fn not_gate(a: bool) -> bool {
8 !a
9}
10pub fn nand_gate(a: bool, b: bool) -> bool {
11 !(a && b)
12}
13pub fn nor_gate(a: bool, b: bool) -> bool {
14 !(a || b)
15}
16pub fn xor_gate(a: bool, b: bool) -> bool {
17 a ^ b
18}
19pub fn xnor_gate(a: bool, b: bool) -> bool {
20 !(a ^ b)
21}
22
23pub fn half_adder(a: bool, b: bool) -> (bool, bool) {
24 (a ^ b, a && b)
25}
26
27pub fn full_adder(a: bool, b: bool, cin: bool) -> (bool, bool) {
28 let (s1, c1) = half_adder(a, b);
29 let (sum, c2) = half_adder(s1, cin);
30 (sum, c1 || c2)
31}
32
33pub fn ripple_carry_adder(a: &[bool], b: &[bool]) -> (Vec<bool>, bool) {
34 let n = a.len();
35 let mut sum = vec![false; n];
36 let mut carry = false;
37 for i in 0..n {
38 let (s, c) = full_adder(a[i], b[i], carry);
39 sum[i] = s;
40 carry = c;
41 }
42 (sum, carry)
43}
44
45pub fn multiplexer_2to1(a: bool, b: bool, sel: bool) -> bool {
46 if sel { b } else { a }
47}
48
49pub fn demultiplexer_1to2(input: bool, sel: bool) -> (bool, bool) {
50 if sel { (false, input) } else { (input, false) }
51}
52
53pub fn decoder_2to4(a: bool, b: bool) -> [bool; 4] {
54 let mut out = [false; 4];
55 let idx = (b as usize) * 2 + a as usize;
56 out[idx] = true;
57 out
58}
59
60pub fn encoder_4to2(inputs: &[bool; 4]) -> (bool, bool) {
61 for i in (0..4).rev() {
62 if inputs[i] {
63 return (i & 1 != 0, i & 2 != 0);
64 }
65 }
66 (false, false)
67}
68
69pub fn sr_latch(s: bool, r: bool, q_prev: bool) -> bool {
70 if s && !r {
71 true
72 } else if !s && r {
73 false
74 } else {
75 q_prev
76 }
77}
78
79pub fn d_flip_flop(d: bool, _: bool) -> bool {
80 d
81}
82
83pub fn jk_flip_flop(j: bool, k: bool, q_prev: bool) -> bool {
84 match (j, k) {
85 (false, false) => q_prev,
86 (false, true) => false,
87 (true, false) => true,
88 (true, true) => !q_prev,
89 }
90}
91
92pub fn binary_to_gray(binary: u32) -> u32 {
93 binary ^ (binary >> 1)
94}
95
96pub fn gray_to_binary(gray: u32) -> u32 {
97 let mut binary = gray;
98 let mut mask = gray >> 1;
99 while mask != 0 {
100 binary ^= mask;
101 mask >>= 1;
102 }
103 binary
104}
105
106pub fn ones_complement(val: u32, bits: u32) -> u32 {
107 val ^ ((1 << bits) - 1)
108}
109
110pub fn twos_complement(val: u32, bits: u32) -> u32 {
111 (ones_complement(val, bits)).wrapping_add(1) & ((1 << bits) - 1)
112}