binius_m3/
emulate.rs

1// Copyright 2025 Irreducible Inc.
2
3use std::{collections::HashMap, hash::Hash};
4
5/// A channel used to validate a high-level M3 trace.
6#[derive(Debug, Default)]
7pub struct Channel<T> {
8	net_multiplicities: HashMap<T, isize>,
9}
10
11impl<T: Hash + Eq> Channel<T> {
12	pub fn push(&mut self, val: T) {
13		match self.net_multiplicities.get_mut(&val) {
14			Some(multiplicity) => {
15				*multiplicity += 1;
16
17				// Remove the key if the multiplicity is zero, to improve Debug behavior.
18				if *multiplicity == 0 {
19					self.net_multiplicities.remove(&val);
20				}
21			}
22			None => {
23				let _ = self.net_multiplicities.insert(val, 1);
24			}
25		}
26	}
27
28	pub fn pull(&mut self, val: T) {
29		match self.net_multiplicities.get_mut(&val) {
30			Some(multiplicity) => {
31				*multiplicity -= 1;
32
33				// Remove the key if the multiplicity is zero, to improve Debug behavior.
34				if *multiplicity == 0 {
35					self.net_multiplicities.remove(&val);
36				}
37			}
38			None => {
39				let _ = self.net_multiplicities.insert(val, -1);
40			}
41		}
42	}
43
44	pub fn is_balanced(&self) -> bool {
45		self.net_multiplicities.is_empty()
46	}
47}