| 2cd40ea1 Andy McCall ↶ |
1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
} |