Skip to main content

sciforge_lib/physics/electronics/
digital.rs

1pub 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}