Skip to main content

ferrunitas/system/defs/
computing.rs

1//! Computing related units
2
3use crate::system::defs::base::{Centimetre, Inch, Second};
4use crate::system::prefixes::*;
5use crate::{quantity, unit};
6use typenum::*;
7
8// ===========================
9// DATA (DIMENSIONLESS)
10// ===========================
11quantity!(Information: M Z0, L Z0, T Z0, I Z0, Th Z0, N Z0, J Z0; marked); // Dimensionless
12
13// Binary units
14unit!(base: Bit, "bit", Information; prefixable);
15unit!(derived: Byte, "B", (8, Bit); prefixable);
16unit!(derived: Nibble, "nibble", (4, Bit));
17unit!(derived: Word, "word", (16, Bit)); // 16-bit word (common in computing)
18unit!(derived: DoubleWord, "dword", (32, Bit)); // 32-bit double word
19unit!(derived: QuadWord, "qword", (64, Bit)); // 64-bit quad word
20
21// Decimal prefixes for bits and bytes
22unit!(prefix: Kilobit, Kilo, Bit);
23unit!(prefix: Megabit, Mega, Bit);
24unit!(prefix: Gigabit, Giga, Bit);
25unit!(prefix: Terabit, Tera, Bit);
26unit!(prefix: Petabit, Peta, Bit);
27unit!(prefix: Exabit, Exa, Bit);
28
29unit!(prefix: Kilobyte, Kilo, Byte);
30unit!(prefix: Megabyte, Mega, Byte);
31unit!(prefix: Gigabyte, Giga, Byte);
32unit!(prefix: Terabyte, Tera, Byte);
33unit!(prefix: Petabyte, Peta, Byte);
34unit!(prefix: Exabyte, Exa, Byte);
35unit!(prefix: Zettabyte, Zetta, Byte);
36unit!(prefix: Yottabyte, Yotta, Byte);
37
38// Binary prefixes for bits and bytes
39unit!(prefix: Kibibit, Kibi, Bit);
40unit!(prefix: Mebibit, Mebi, Bit);
41unit!(prefix: Gibibit, Gibi, Bit);
42unit!(prefix: Tebibit, Tebi, Bit);
43unit!(prefix: Pebibit, Pebi, Bit);
44unit!(prefix: Exbibit, Exbi, Bit);
45unit!(prefix: Zebibit, Zebi, Bit);
46unit!(prefix: Yobibit, Yobi, Bit);
47
48unit!(prefix: Kibibyte, Kibi, Byte);
49unit!(prefix: Mebibyte, Mebi, Byte);
50unit!(prefix: Gibibyte, Gibi, Byte);
51unit!(prefix: Tebibyte, Tebi, Byte);
52unit!(prefix: Pebibyte, Pebi, Byte);
53unit!(prefix: Exbibyte, Exbi, Byte);
54unit!(prefix: Zebibyte, Zebi, Byte);
55unit!(prefix: Yobibyte, Yobi, Byte);
56
57// ===========================
58// DATA THROUGHPUT / BANDWIDTH
59// ===========================
60quantity!(DataRate: M Z0, L Z0, T N1, I Z0, Th Z0, N Z0, J Z0; marked); // Information per time
61
62// Base units for data rates
63unit!(compound: BitPerSecond, "bit/s", [(Bit, P1), (Second, N1)]; prefixable, marked DataRate);
64unit!(compound: BytePerSecond, "B/s", [(Byte, P1), (Second, N1)]; prefixable, marked DataRate);
65
66// Common bandwidth units with decimal prefixes
67unit!(prefix: KilobitPerSecond, Kilo, BitPerSecond);
68unit!(prefix: MegabitPerSecond, Mega, BitPerSecond);
69unit!(prefix: GigabitPerSecond, Giga, BitPerSecond);
70unit!(prefix: TerabitPerSecond, Tera, BitPerSecond);
71
72unit!(prefix: KilobytePerSecond, Kilo, BytePerSecond);
73unit!(prefix: MegabytePerSecond, Mega, BytePerSecond);
74unit!(prefix: GigabytePerSecond, Giga, BytePerSecond);
75unit!(prefix: TerabytePerSecond, Tera, BytePerSecond);
76
77// Binary prefix bandwidth units
78unit!(prefix: KibibitPerSecond, Kibi, BitPerSecond);
79unit!(prefix: MebibitPerSecond, Mebi, BitPerSecond);
80unit!(prefix: GibibitPerSecond, Gibi, BitPerSecond);
81unit!(prefix: TebibitPerSecond, Tebi, BitPerSecond);
82
83unit!(prefix: KibibytePerSecond, Kibi, BytePerSecond);
84unit!(prefix: MebibytePerSecond, Mebi, BytePerSecond);
85unit!(prefix: GibibytePerSecond, Gibi, BytePerSecond);
86unit!(prefix: TebibytePerSecond, Tebi, BytePerSecond);
87
88// ===========================
89// COMPUTATIONAL PERFORMANCE
90// ===========================
91quantity!(ComputationalRate: M Z0, L Z0, T N1, I Z0, Th Z0, N Z0, J Z0; marked); // Operations per time (dimensionless/time)
92
93// Instructions per second
94unit!(base: InstructionPerSecond, "IPS", ComputationalRate; prefixable);
95unit!(prefix: KiloInstructionPerSecond, Kilo, InstructionPerSecond);
96unit!(prefix: MegaInstructionPerSecond, Mega, InstructionPerSecond);
97unit!(prefix: GigaInstructionPerSecond, Giga, InstructionPerSecond);
98
99// Floating point operations per second
100unit!(base: FloatingPointOperationPerSecond, "FLOPS", ComputationalRate; prefixable);
101unit!(prefix: KiloFloatingPointOperationPerSecond, Kilo, FloatingPointOperationPerSecond);
102unit!(prefix: MegaFloatingPointOperationPerSecond, Mega, FloatingPointOperationPerSecond);
103unit!(prefix: GigaFloatingPointOperationPerSecond, Giga, FloatingPointOperationPerSecond);
104unit!(prefix: TeraFloatingPointOperationPerSecond, Tera, FloatingPointOperationPerSecond);
105unit!(prefix: PetaFloatingPointOperationPerSecond, Peta, FloatingPointOperationPerSecond);
106unit!(prefix: ExaFloatingPointOperationPerSecond, Exa, FloatingPointOperationPerSecond);
107
108// ===========================
109// RESOLUTION / PIXEL DENSITY
110// ===========================
111quantity!(PixelDensity: M Z0, L N1, T Z0, I Z0, Th Z0, N Z0, J Z0; marked); // Pixels per area
112
113unit!(compound: PixelPerInch, "PPI", [(Inch, N1)]; marked PixelDensity); // Pixels per inch
114unit!(compound: DotPerInch, "DPI", [(Inch, N1)]; marked PixelDensity); // Dots per inch (printing)
115unit!(compound: PixelPerCentimetre, "PPCM", [(Centimetre, N1)]; marked PixelDensity); // Pixels per cm
116
117#[cfg(test)]
118mod tests {
119    use super::*;
120    use crate::common::verify_unit;
121
122    // DATA (DIMENSIONLESS)
123    verify_unit!(Bit, Information, 1.0);
124    verify_unit!(Byte, Information, 8.0);
125    verify_unit!(Nibble, Information, 4.0);
126    verify_unit!(Word, Information, 16.0);
127    verify_unit!(DoubleWord, Information, 32.0);
128    verify_unit!(QuadWord, Information, 64.0);
129
130    // DECIMAL PREFIXED DATA UNITS
131    verify_unit!(Kilobit, Information, 1000.0);
132    verify_unit!(Megabit, Information, 1_000_000.0);
133    verify_unit!(Gigabit, Information, 1_000_000_000.0);
134    verify_unit!(Terabit, Information, 1_000_000_000_000.0);
135    verify_unit!(Petabit, Information, 1_000_000_000_000_000.0);
136    verify_unit!(Exabit, Information, 1_000_000_000_000_000_000.0);
137
138    verify_unit!(Kilobyte, Information, 8_000.0);
139    verify_unit!(Megabyte, Information, 8_000_000.0);
140    verify_unit!(Gigabyte, Information, 8_000_000_000.0);
141    verify_unit!(Terabyte, Information, 8_000_000_000_000.0);
142    verify_unit!(Petabyte, Information, 8_000_000_000_000_000.0);
143    verify_unit!(Exabyte, Information, 8_000_000_000_000_000_000.0);
144    verify_unit!(Zettabyte, Information, 8e21);
145    verify_unit!(Yottabyte, Information, 8e24);
146
147    // BINARY PREFIXED DATA UNITS
148    verify_unit!(Kibibit, Information, 1024.0);
149    verify_unit!(Mebibit, Information, 1_048_576.0);
150    verify_unit!(Gibibit, Information, 1_073_741_824.0);
151    verify_unit!(Tebibit, Information, 1_099_511_627_776.0);
152    verify_unit!(Pebibit, Information, 1_125_899_906_842_624.0);
153    verify_unit!(Exbibit, Information, 1_152_921_504_606_846_976.0);
154    verify_unit!(Zebibit, Information, 1_180_591_620_717_411_303_424.0);
155    verify_unit!(Yobibit, Information, 1_208_925_819_614_629_174_706_176.0);
156
157    verify_unit!(Kibibyte, Information, 8_192.0);
158    verify_unit!(Mebibyte, Information, 8_388_608.0);
159    verify_unit!(Gibibyte, Information, 8_589_934_592.0);
160    verify_unit!(Tebibyte, Information, 8_796_093_022_208.0);
161    verify_unit!(Pebibyte, Information, 9_007_199_254_740_992.0);
162    verify_unit!(Exbibyte, Information, 9_223_372_036_854_775_808.0);
163    verify_unit!(Zebibyte, Information, 9_444_732_965_739_290_427_392.0);
164    verify_unit!(Yobibyte, Information, 9_671_406_556_917_033_397_649_408.0);
165
166    // DATA RATE UNITS
167    verify_unit!(BitPerSecond, DataRate, 1.0);
168    verify_unit!(BytePerSecond, DataRate, 8.0);
169
170    // DECIMAL PREFIXED DATA RATE UNITS
171    verify_unit!(KilobitPerSecond, DataRate, 1_000.0);
172    verify_unit!(MegabitPerSecond, DataRate, 1_000_000.0);
173    verify_unit!(GigabitPerSecond, DataRate, 1_000_000_000.0);
174    verify_unit!(TerabitPerSecond, DataRate, 1_000_000_000_000.0);
175
176    verify_unit!(KilobytePerSecond, DataRate, 8_000.0);
177    verify_unit!(MegabytePerSecond, DataRate, 8_000_000.0);
178    verify_unit!(GigabytePerSecond, DataRate, 8_000_000_000.0);
179    verify_unit!(TerabytePerSecond, DataRate, 8_000_000_000_000.0);
180
181    // BINARY PREFIXED DATA RATE UNITS
182    verify_unit!(KibibitPerSecond, DataRate, 1_024.0);
183    verify_unit!(MebibitPerSecond, DataRate, 1_048_576.0);
184    verify_unit!(GibibitPerSecond, DataRate, 1_073_741_824.0);
185    verify_unit!(TebibitPerSecond, DataRate, 1_099_511_627_776.0);
186
187    verify_unit!(KibibytePerSecond, DataRate, 8_192.0);
188    verify_unit!(MebibytePerSecond, DataRate, 8_388_608.0);
189    verify_unit!(GibibytePerSecond, DataRate, 8_589_934_592.0);
190    verify_unit!(TebibytePerSecond, DataRate, 8_796_093_022_208.0);
191
192    // COMPUTATIONAL PERFORMANCE UNITS
193    verify_unit!(InstructionPerSecond, ComputationalRate, 1.0);
194    verify_unit!(KiloInstructionPerSecond, ComputationalRate, 1_000.0);
195    verify_unit!(MegaInstructionPerSecond, ComputationalRate, 1_000_000.0);
196    verify_unit!(GigaInstructionPerSecond, ComputationalRate, 1_000_000_000.0);
197
198    verify_unit!(FloatingPointOperationPerSecond, ComputationalRate, 1.0);
199    verify_unit!(
200        KiloFloatingPointOperationPerSecond,
201        ComputationalRate,
202        1_000.0
203    );
204    verify_unit!(
205        MegaFloatingPointOperationPerSecond,
206        ComputationalRate,
207        1_000_000.0
208    );
209    verify_unit!(
210        GigaFloatingPointOperationPerSecond,
211        ComputationalRate,
212        1_000_000_000.0
213    );
214    verify_unit!(
215        TeraFloatingPointOperationPerSecond,
216        ComputationalRate,
217        1_000_000_000_000.0
218    );
219    verify_unit!(
220        PetaFloatingPointOperationPerSecond,
221        ComputationalRate,
222        1_000_000_000_000_000.0
223    );
224    verify_unit!(
225        ExaFloatingPointOperationPerSecond,
226        ComputationalRate,
227        1_000_000_000_000_000_000.0
228    );
229
230    // PIXEL DENSITY UNITS
231    verify_unit!(PixelPerInch, PixelDensity, 39.3700787402); // 1/inch in 1/m
232    verify_unit!(DotPerInch, PixelDensity, 39.3700787402); // Same as PPI
233    verify_unit!(PixelPerCentimetre, PixelDensity, 100.0); // 1/cm in 1/m
234}