app: stacked_cores: new experiment where we write S1 -> {S0,S2} and then write *back* to S1 from these

This commit is contained in:
2022-09-04 01:27:54 -07:00
parent b8878bde1d
commit 5cdedfee41
2 changed files with 227 additions and 2 deletions

View File

@@ -239,6 +239,26 @@ fn drive_map_3stack() -> [[ClockState; 3]; 6] {
] ]
} }
#[allow(unused)]
fn drive_map_3stack_and_rev() -> [[ClockState; 3]; 6] {
use ClockState::*;
[
// charge S1 to '1', S0/S2 to '0'
[HoldLow, HoldHigh, HoldLow ],
// let the cores settle
[ReleaseLow, ReleaseHigh,ReleaseLow],
// write S1 -> S0/S2. S0/S2 should be copied to 1
[Float, HoldLow, Float ],
// open S1 for write
[Float, ReleaseLow, Float ],
// write {S0,S2} -> S1
[HoldLow, Float, HoldLow ],
// let settle
[ReleaseLow, Float, ReleaseLow ],
]
}
#[allow(unused)] #[allow(unused)]
fn drive_map_3stack_one_sided() -> [[ClockState; 3]; 6] { fn drive_map_3stack_one_sided() -> [[ClockState; 3]; 6] {
use ClockState::*; use ClockState::*;
@@ -299,6 +319,42 @@ fn drive_map_5stack_one_sided_inv() -> [[ClockState; 5]; 6] {
] ]
} }
#[allow(unused)]
fn drive_map_nstack_one_sided_inv<const C: usize>() -> [[ClockState; C]; 6] {
use ClockState::*;
let mut clocks = [[Float; C]; 6];
clocks[0][0] = HoldHigh; // charge S0 high
clocks[1][0] = ReleaseHigh; // let settle
clocks[2][0] = HoldLow; // write S0 -> S1, {S2, ...}
clocks[3][0] = HoldLow; // charge S0 low
clocks[4][0] = ReleaseLow; // let settle
clocks[5][0] = HoldLow; // write S0 -> S1, {S2, ...}
for c in 1..C {
clocks[0][c] = match c % 2 { // charge to base state
1 => HoldLow,
_ => ReleaseLow,
};
clocks[1][c] = match c % 2 { // let settle
1 => ReleaseLow,
_ => ReleaseHigh,
};
clocks[2][c] = Float; // accept the active transfer
clocks[3][c] = match c % 2 { // charge to base state
1 => HoldLow,
_ => HoldHigh,
};
clocks[4][c] = match c % 2 { // let settle
1 => ReleaseLow,
_ => ReleaseHigh,
};
clocks[5][c] = Float; // accept the noop transfer
}
clocks
}
fn main() { fn main() {
coremem::init_logging(); coremem::init_logging();
// coremem::init_debug(); // coremem::init_debug();
@@ -580,7 +636,7 @@ fn main() {
p6xx.with_coupling_loops(20), p6xx.with_coupling_loops(20),
); );
} }
if true { if false {
let p7xx = params let p7xx = params
.with_clock_phase_duration(ps(1000)) .with_clock_phase_duration(ps(1000))
.with_clock_decay(ps(50)) .with_clock_decay(ps(50))
@@ -635,6 +691,127 @@ fn main() {
p7xx.with_coupling_loops(20), p7xx.with_coupling_loops(20),
); );
} }
if false {
let p8xx = params
.with_clock_phase_duration(ps(1000))
.with_clock_decay(ps(50))
.with_input_magnitude(8e10)
.with_ctl_conductivity(5e2)
.with_coupling_conductivity(5e3)
.with_s_major(um(400))
.with_coupling_loops(16)
;
run_sim(
"803-3core",
drive_map_nstack_one_sided_inv::<3>(),
p8xx,
);
run_sim(
"805-5core",
drive_map_nstack_one_sided_inv::<5>(),
p8xx,
);
run_sim(
"807-7core",
drive_map_nstack_one_sided_inv::<7>(),
p8xx,
);
run_sim(
"809-9core",
drive_map_nstack_one_sided_inv::<9>(),
p8xx,
);
run_sim(
"811-11core",
drive_map_nstack_one_sided_inv::<11>(),
p8xx,
);
run_sim(
"813-13core",
drive_map_nstack_one_sided_inv::<13>(),
p8xx,
);
run_sim(
"815-15core",
drive_map_nstack_one_sided_inv::<15>(),
p8xx,
);
run_sim(
"817-17core",
drive_map_nstack_one_sided_inv::<17>(),
p8xx,
);
run_sim(
"819-19core",
drive_map_nstack_one_sided_inv::<19>(),
p8xx,
);
run_sim(
"820-20core",
drive_map_nstack_one_sided_inv::<20>(),
p8xx,
);
run_sim(
"821-21core",
drive_map_nstack_one_sided_inv::<21>(),
p8xx,
);
}
if true {
let p9xx = params
.with_clock_phase_duration(ps(1000))
.with_clock_decay(ps(50))
.with_input_magnitude(8e10)
.with_ctl_conductivity(5e2)
.with_coupling_conductivity(5e3)
.with_s_major(um(400))
;
run_sim(
"912-12loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(12),
);
run_sim(
"916-16loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(16),
);
run_sim(
"908-8loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(8),
);
run_sim(
"910-10loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(10),
);
run_sim(
"920-20loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(20),
);
run_sim(
"906-6loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(6),
);
run_sim(
"901-1loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(1),
);
run_sim(
"902-2loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(2),
);
run_sim(
"904-4loops",
drive_map_3stack_and_rev(),
p9xx.with_coupling_loops(4),
);
}
// run_sim( // run_sim(
// "76-2ns-100ps-1e10A-1e3pctl-1e4pcpl-4loops", // "76-2ns-100ps-1e10A-1e3pctl-1e4pcpl-4loops",
// drive_map_isolated_inv(), // drive_map_isolated_inv(),
@@ -770,7 +947,7 @@ fn run_sim<const C: usize, const R: usize>(
let prefix = format!("out/applications/stacked_cores/{}/", name); let prefix = format!("out/applications/stacked_cores/{}/", name);
let _ = std::fs::create_dir_all(&prefix); let _ = std::fs::create_dir_all(&prefix);
driver.add_state_file(&*format!("{}state.bc", prefix), 25600); driver.add_state_file(&*format!("{}state.bc", prefix), 25600);
driver.add_serializer_renderer(&*format!("{}frame-", prefix), 6400, Some(12800)); // driver.add_serializer_renderer(&*format!("{}frame-", prefix), 6400, Some(12800));
// driver.add_csv_renderer(&*format!("{}meas-detailed.csv", prefix), 100, None); // driver.add_csv_renderer(&*format!("{}meas-detailed.csv", prefix), 100, None);
driver.add_csv_renderer(&*format!("{}meas.csv", prefix), 1600, None); driver.add_csv_renderer(&*format!("{}meas.csv", prefix), 1600, None);
driver.add_csv_renderer(&*format!("{}meas-sparse.csv", prefix), 12800, None); driver.add_csv_renderer(&*format!("{}meas-sparse.csv", prefix), 12800, None);

View File

@@ -0,0 +1,48 @@
#!/usr/bin/env python3
"""
invoke with the path to a meas.csv file for the stacked_core 8xx demos
to extract higher-level info from them.
"""
import sys
from stacked_cores import load_csv, labeled_rows, last_row_before_t, extract_m
def extract_9xx(path: str):
header, raw_rows = load_csv(path)
rows = labeled_rows(header, raw_rows)
tx_start = last_row_before_t(rows, 2e-9)
tx_end = last_row_before_t(rows, 4e-9)
rev_start = last_row_before_t(rows, 4e-9)
rev_end = last_row_before_t(rows, 6e-9)
m_tx_start = extract_m(tx_start)
m_tx_end = extract_m(tx_end)
m_rev_start = extract_m(rev_start)
m_rev_end = extract_m(rev_end)
m1_switch = abs(m_tx_end[1] - m_tx_start[1])
m1_rev_switch = abs(m_rev_end[1] - m_rev_start[1])
m_tx_switch_arr = [round(abs(m_tx_end[i] - m_tx_start[i])) for i in [0, 2]]
m_tx_switch = sum(m_tx_switch_arr)
m_rev_switch_arr = [round(abs(m_rev_end[i] - m_rev_start[i])) for i in [0, 2]]
m_rev_switch = sum(m_rev_switch_arr)
ratio_tx_switch = m_tx_switch / m1_switch
ratio_roundtrip = m1_rev_switch / m1_switch
print(f'm1 tx: {m1_switch} ({m_tx_start[1]} -> {m_tx_end[1]})')
print(f'm1 rev: {m1_rev_switch} ({m_rev_start[1]} -> {m_rev_end[1]})')
print('')
print(f'm(tx): {m_tx_start}')
print(f' -> {m_tx_end}')
print('')
print(f'm(rev): {m_rev_start}')
print(f' -> {m_rev_end}')
print('')
print(f'tx/m1: {ratio_tx_switch:.3}')
print(f'rev/m1: {ratio_roundtrip:.3}')
if __name__ == '__main__':
extract_9xx(sys.argv[1])