2021-08-23 03:53:21 +00:00
|
|
|
// Copyright (c) 2021 Weird Constructor <weirdconstructor@gmail.com>
|
|
|
|
// This file is a part of HexoDSP. Released under GPL-3.0-or-later.
|
|
|
|
// See README.md and COPYING for details.
|
|
|
|
|
|
|
|
mod common;
|
|
|
|
use common::*;
|
|
|
|
|
|
|
|
fn setup_mux9_slct(matrix: &mut Matrix) {
|
2022-07-17 09:58:28 +00:00
|
|
|
let amp = NodeId::Amp(0);
|
2021-08-23 03:53:21 +00:00
|
|
|
let mux9 = NodeId::Mux9(0);
|
2022-07-17 09:58:28 +00:00
|
|
|
let out = NodeId::Out(0);
|
|
|
|
matrix.place(0, 0, Cell::empty(amp).out(None, None, amp.out("sig")));
|
|
|
|
matrix.place(
|
|
|
|
0,
|
|
|
|
1,
|
|
|
|
Cell::empty(mux9).input(mux9.inp("slct"), None, None).out(None, None, mux9.out("sig")),
|
|
|
|
);
|
|
|
|
matrix.place(0, 2, Cell::empty(out).input(out.inp("ch1"), None, None));
|
2021-08-23 03:53:21 +00:00
|
|
|
for i in 1..=9 {
|
|
|
|
pset_n(matrix, mux9, &format!("in_{}", i), 0.01 * (i as f32));
|
|
|
|
}
|
|
|
|
|
|
|
|
matrix.sync().unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
fn setup_mux9(matrix: &mut Matrix) {
|
|
|
|
let mux9 = NodeId::Mux9(0);
|
2022-07-17 09:58:28 +00:00
|
|
|
let out = NodeId::Out(0);
|
|
|
|
matrix.place(0, 0, Cell::empty(mux9).out(None, None, mux9.out("sig")));
|
|
|
|
matrix.place(0, 1, Cell::empty(out).input(out.inp("ch1"), None, None));
|
2021-08-23 03:53:21 +00:00
|
|
|
for i in 1..=9 {
|
|
|
|
pset_n(matrix, mux9, &format!("in_{}", i), 0.01 * (i as f32));
|
|
|
|
}
|
|
|
|
|
|
|
|
matrix.sync().unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn check_node_mux9_9() {
|
|
|
|
init_test!(matrix, node_exec, 3);
|
|
|
|
setup_mux9(matrix);
|
|
|
|
|
|
|
|
let mux9 = NodeId::Mux9(0);
|
|
|
|
|
|
|
|
pset_s(matrix, mux9, "in_cnt", 9.into());
|
|
|
|
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01);
|
|
|
|
|
|
|
|
for i in 2..=9 {
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 0.0);
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 1.0);
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01 * (i as f32));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn check_node_mux9_limit() {
|
|
|
|
init_test!(matrix, node_exec, 3);
|
|
|
|
setup_mux9(matrix);
|
|
|
|
|
|
|
|
let mux9 = NodeId::Mux9(0);
|
|
|
|
|
|
|
|
pset_s(matrix, mux9, "in_cnt", 2.into());
|
|
|
|
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01);
|
|
|
|
|
|
|
|
for i in 2..=3 {
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 0.0);
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 1.0);
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01 * (i as f32));
|
|
|
|
}
|
|
|
|
|
|
|
|
for i in 1..=3 {
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 0.0);
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 1.0);
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01 * (i as f32));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn check_node_mux9_reset() {
|
|
|
|
init_test!(matrix, node_exec, 3);
|
|
|
|
setup_mux9(matrix);
|
|
|
|
|
|
|
|
let mux9 = NodeId::Mux9(0);
|
|
|
|
|
|
|
|
pset_s(matrix, mux9, "in_cnt", 5.into());
|
|
|
|
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01);
|
|
|
|
|
|
|
|
for i in 2..=3 {
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 0.0);
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 1.0);
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01 * (i as f32));
|
|
|
|
}
|
|
|
|
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_rst", 1.0);
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_rst", 0.0);
|
|
|
|
|
|
|
|
for i in 1..=3 {
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01 * (i as f32));
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 0.0);
|
|
|
|
pset_n_wait(matrix, node_exec, mux9, "t_up", 1.0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn check_node_mux9_slct() {
|
|
|
|
init_test!(matrix, node_exec, 3);
|
|
|
|
setup_mux9_slct(matrix);
|
|
|
|
|
|
|
|
let mux9 = NodeId::Mux9(0);
|
2022-07-17 09:58:28 +00:00
|
|
|
let amp = NodeId::Amp(0);
|
2021-08-23 03:53:21 +00:00
|
|
|
|
|
|
|
pset_s(matrix, mux9, "in_cnt", 5.into());
|
|
|
|
pset_n_wait(matrix, node_exec, amp, "inp", 0.9);
|
|
|
|
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.06);
|
|
|
|
|
|
|
|
pset_n_wait(matrix, node_exec, amp, "inp", 0.0);
|
|
|
|
let (out, _) = run_for_ms(node_exec, 1.0);
|
|
|
|
assert_float_eq!(out[0], 0.01);
|
|
|
|
|
|
|
|
pset_n(matrix, amp, "inp", 1.0);
|
|
|
|
let (out, _) = run_for_ms(node_exec, 20.0);
|
2022-07-17 09:58:28 +00:00
|
|
|
assert_decimated_feq!(out, 90, vec![0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.06, 0.06, 0.06,]);
|
2021-08-23 03:53:21 +00:00
|
|
|
|
|
|
|
pset_s(matrix, mux9, "in_cnt", 8.into());
|
|
|
|
pset_n_wait(matrix, node_exec, amp, "inp", 0.0);
|
|
|
|
|
|
|
|
pset_n(matrix, amp, "inp", 1.0);
|
|
|
|
let (out, _) = run_for_ms(node_exec, 20.0);
|
2022-07-17 09:58:28 +00:00
|
|
|
assert_decimated_feq!(
|
|
|
|
out,
|
|
|
|
50,
|
|
|
|
vec![0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.09, 0.09, 0.09, 0.09,]
|
|
|
|
);
|
2021-08-23 03:53:21 +00:00
|
|
|
}
|