OXYGENHUB
# dab94366a4f0 oxygen / vendor / crc-fast / src / bin / generate-tables.rs
5.8 KiB · Rust · last changed Strata: the cloud stores send through ureq, so every release target links 1 month ago source blame history raw
1
// Copyright 2025 Don MacAskill. Licensed under MIT or Apache-2.0.
2
3
//! Utility to generate pre-computed 16-lane lookup tables for all CRC algorithms.
4
//!
5
//! This generates Rust source code that can be used to create the `src/tables.rs` module.
6
//! Run with: `cargo run --bin generate_tables > src/tables.rs`
7
8
use crc_fast::arch::software::{generate_table_u16, generate_table_u32, generate_table_u64};
9
10
fn main() {
11
    println!("// Copyright 2025 Don MacAskill. Licensed under MIT or Apache-2.0.");
12
    println!();
13
    println!("//! Pre-generated 16-lane lookup tables for CRC calculations.");
14
    println!("//!");
15
    println!("//! This file is auto-generated by `cargo run --bin generate_tables`.");
16
    println!("//! Do not edit manually.");
17
    println!();
18
    println!("#![allow(dead_code)]");
19
    println!();
20
21
    generate_crc16_tables();
22
    generate_crc32_tables();
23
    generate_crc64_tables();
24
}
25
26
fn generate_crc16_tables() {
27
    println!("pub mod crc16 {{");
28
    println!("    //! CRC-16 lookup tables");
29
    println!();
30
31
    // CRC-16 algorithms with their parameters: (name, poly, reflect)
32
    let algorithms: &[(&str, u16, bool)] = &[
33
        ("ARC", 0x8005, true),
34
        ("CDMA2000", 0xc867, false),
35
        ("CMS", 0x8005, false),
36
        ("DDS_110", 0x8005, false),
37
        ("DECT_R", 0x0589, false),
38
        ("DECT_X", 0x0589, false),
39
        ("DNP", 0x3d65, true),
40
        ("EN_13757", 0x3d65, false),
41
        ("GENIBUS", 0x1021, false),
42
        ("GSM", 0x1021, false),
43
        ("IBM_3740", 0x1021, false),
44
        ("IBM_SDLC", 0x1021, true),
45
        ("ISO_IEC_14443_3_A", 0x1021, true),
46
        ("KERMIT", 0x1021, true),
47
        ("LJ1200", 0x6f63, false),
48
        ("M17", 0x5935, false),
49
        ("MAXIM_DOW", 0x8005, true),
50
        ("MCRF4XX", 0x1021, true),
51
        ("MODBUS", 0x8005, true),
52
        ("NRSC_5", 0x080b, true),
53
        ("OPENSAFETY_A", 0x5935, false),
54
        ("OPENSAFETY_B", 0x755b, false),
55
        ("PROFIBUS", 0x1dcf, false),
56
        ("RIELLO", 0x1021, true),
57
        ("SPI_FUJITSU", 0x1021, false),
58
        ("T10_DIF", 0x8bb7, false),
59
        ("TELEDISK", 0xa097, false),
60
        ("TMS37157", 0x1021, true),
61
        ("UMTS", 0x8005, false),
62
        ("USB", 0x8005, true),
63
        ("XMODEM", 0x1021, false),
64
    ];
65
66
    for (name, poly, reflect) in algorithms {
67
        print_table_u16(name, 16, *poly, *reflect);
68
    }
69
70
    println!("}}");
71
    println!();
72
}
73
74
fn generate_crc32_tables() {
75
    println!("pub mod crc32 {{");
76
    println!("    //! CRC-32 lookup tables");
77
    println!();
78
79
    // CRC-32 algorithms with their parameters: (name, poly, reflect)
80
    let algorithms: &[(&str, u32, bool)] = &[
81
        ("AIXM", 0x814141ab, false),
82
        ("AUTOSAR", 0xf4acfb13, true),
83
        ("BASE91_D", 0xa833982b, true),
84
        ("BZIP2", 0x04c11db7, false),
85
        ("CD_ROM_EDC", 0x8001801b, true),
86
        ("CKSUM", 0x04c11db7, false),
87
        ("ISCSI", 0x1edc6f41, true),
88
        ("ISO_HDLC", 0x04c11db7, true),
89
        ("JAMCRC", 0x04c11db7, true),
90
        ("MEF", 0x741b8cd7, true),
91
        ("MPEG_2", 0x04c11db7, false),
92
        ("XFER", 0x000000af, false),
93
    ];
94
95
    for (name, poly, reflect) in algorithms {
96
        print_table_u32(name, 32, *poly, *reflect);
97
    }
98
99
    println!("}}");
100
    println!();
101
}
102
103
fn generate_crc64_tables() {
104
    println!("pub mod crc64 {{");
105
    println!("    //! CRC-64 lookup tables");
106
    println!();
107
108
    // CRC-64 algorithms with their parameters: (name, poly, reflect)
109
    let algorithms: &[(&str, u64, bool)] = &[
110
        ("ECMA_182", 0x42f0e1eba9ea3693, false),
111
        ("GO_ISO", 0x000000000000001b, true),
112
        ("MS", 0x259c84cba6426349, true),
113
        ("NVME", 0xad93d23594c93659, true),
114
        ("REDIS", 0xad93d23594c935a9, true),
115
        ("WE", 0x42f0e1eba9ea3693, false),
116
        ("XZ", 0x42f0e1eba9ea3693, true),
117
    ];
118
119
    for (name, poly, reflect) in algorithms {
120
        print_table_u64(name, 64, *poly, *reflect);
121
    }
122
123
    println!("}}");
124
}
125
126
fn print_table_u16(name: &str, width: u8, poly: u16, reflect: bool) {
127
    let table = generate_table_u16(width, poly, reflect);
128
129
    println!("    pub static CRC16_{}_TABLE: [[u16; 256]; 16] = [", name);
130
    for lane in &table {
131
        println!("        [");
132
        for chunk in lane.chunks(8) {
133
            print!("            ");
134
            for (i, val) in chunk.iter().enumerate() {
135
                print!("0x{:04x}", val);
136
                if i < chunk.len() - 1 {
137
                    print!(", ");
138
                }
139
            }
140
            println!(",");
141
        }
142
        println!("        ],");
143
    }
144
    println!("    ];");
145
    println!();
146
}
147
148
fn print_table_u32(name: &str, width: u8, poly: u32, reflect: bool) {
149
    let table = generate_table_u32(width, poly, reflect);
150
151
    println!("    pub static CRC32_{}_TABLE: [[u32; 256]; 16] = [", name);
152
    for lane in &table {
153
        println!("        [");
154
        for chunk in lane.chunks(4) {
155
            print!("            ");
156
            for (i, val) in chunk.iter().enumerate() {
157
                print!("0x{:08x}", val);
158
                if i < chunk.len() - 1 {
159
                    print!(", ");
160
                }
161
            }
162
            println!(",");
163
        }
164
        println!("        ],");
165
    }
166
    println!("    ];");
167
    println!();
168
}
169
170
fn print_table_u64(name: &str, width: u8, poly: u64, reflect: bool) {
171
    let table = generate_table_u64(width, poly, reflect);
172
173
    println!("    pub static CRC64_{}_TABLE: [[u64; 256]; 16] = [", name);
174
    for lane in &table {
175
        println!("        [");
176
        for chunk in lane.chunks(2) {
177
            print!("            ");
178
            for (i, val) in chunk.iter().enumerate() {
179
                print!("0x{:016x}", val);
180
                if i < chunk.len() - 1 {
181
                    print!(", ");
182
                }
183
            }
184
            println!(",");
185
        }
186
        println!("        ],");
187
    }
188
    println!("    ];");
189
    println!();
190
}