app: stacked_cores: 46-xx: complete some runs of an inverter cascaded into a buffer
the results aren't great :'(
This commit is contained in:
parent
33b0b76278
commit
bc61fd0d0a
|
@ -2058,6 +2058,7 @@ name = "stacked_cores"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"coremem",
|
"coremem",
|
||||||
|
"log",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -6,3 +6,4 @@ edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
coremem = { path = "../../coremem" }
|
coremem = { path = "../../coremem" }
|
||||||
|
log = "0.4"
|
||||||
|
|
|
@ -132,6 +132,7 @@ of_interest += [(p, get_meas(p)) for p in
|
||||||
|
|
||||||
|
|
||||||
# plot all viable inverters
|
# plot all viable inverters
|
||||||
|
of_interest += filter_meas(run="40")
|
||||||
# of_interest += filter_meas(run="41", viable_inverter=True)
|
# of_interest += filter_meas(run="41", viable_inverter=True)
|
||||||
# of_interest += filter_meas(run="42", rad_um=400, couplings=4)
|
# of_interest += filter_meas(run="42", rad_um=400, couplings=4)
|
||||||
# of_interest += filter_meas(run="42", rad_um=400, couplings=9)
|
# of_interest += filter_meas(run="42", rad_um=400, couplings=9)
|
||||||
|
@ -139,18 +140,28 @@ of_interest += [(p, get_meas(p)) for p in
|
||||||
# of_interest += filter_meas(run="42", rad_um=400, couplings=6)
|
# of_interest += filter_meas(run="42", rad_um=400, couplings=6)
|
||||||
# of_interest += filter_meas(run="43")
|
# of_interest += filter_meas(run="43")
|
||||||
|
|
||||||
for (inv_p, inv_curve) in filter_meas(is_inverter=True):
|
# plot cascaded inverter -> buffer
|
||||||
for (fwd_p, fwd_curve) in filter_meas(rad_um=400, is_inverter=False):
|
# for (inv_p, inv_curve) in filter_meas(is_inverter=True):
|
||||||
of_interest += [ (SimParamsCascaded(inv_p, fwd_p), inv_curve.cascaded(fwd_curve)) ]
|
# for (fwd_p, fwd_curve) in filter_meas(rad_um=400, is_inverter=False):
|
||||||
|
# of_interest += [ (SimParamsCascaded(inv_p, fwd_p), inv_curve.cascaded(fwd_curve)) ]
|
||||||
|
# plot cascaded buffer -> inverter
|
||||||
|
# for (fwd_p, fwd_curve) in filter_meas(run="41", is_inverter=False):
|
||||||
|
# for (inv_p, inv_curve) in filter_meas(is_inverter=True):
|
||||||
|
# of_interest += [ (SimParamsCascaded(fwd_p, inv_p), fwd_curve.cascaded(inv_curve)) ]
|
||||||
|
|
||||||
|
# of_interest += filter_meas(is_inverter=False)
|
||||||
|
# of_interest += filter_meas(is_inverter=True)
|
||||||
|
|
||||||
# of_interest.sort(key = lambda i: -i[1].max_abs_slope())
|
# of_interest.sort(key = lambda i: -i[1].max_abs_slope())
|
||||||
# of_interest.sort(key = lambda i: -i[1].get_range())
|
of_interest.sort(key = lambda i: -i[1].get_range()) # output range
|
||||||
of_interest.sort(key = lambda i: i[1].get_repeated(1.0) - i[1].get_repeated(0.0)) # inverter strength
|
# of_interest.sort(key = lambda i: i[1].get(0.5) - i[1].get(1.0)) # delayed output swing
|
||||||
|
# of_interest.sort(key = lambda i: i[1].get(0.5) - i[1].get(0.0)) # early output swing
|
||||||
|
# of_interest.sort(key = lambda i: i[1].get_repeated(1.0) - i[1].get_repeated(0.0)) # inverter strength
|
||||||
|
|
||||||
for (params, curve) in of_interest[:5]:
|
for (params, curve) in of_interest[:5]:
|
||||||
curve.plot(title = f"{params.human_name} mapping")
|
curve.plot(title = f"{params.human_name} mapping")
|
||||||
curve.plot_slope(title = f"{params.human_name} slope")
|
curve.plot_slope(title = f"{params.human_name} slope")
|
||||||
if not params.is_inverter:
|
# if not params.is_inverter:
|
||||||
curve = curve.logically_inverted()
|
# curve = curve.logically_inverted()
|
||||||
curve.plot_equilibrium(title = f"{params.human_name} equilibrium")
|
if params.is_inverter:
|
||||||
|
curve.plot_equilibrium(title = f"{params.human_name} equilibrium")
|
||||||
|
|
|
@ -118,6 +118,19 @@ class SimParams43(SimParams):
|
||||||
def t_last(self) -> float:
|
def t_last(self) -> float:
|
||||||
return 5e-9
|
return 5e-9
|
||||||
|
|
||||||
|
class SimParams46(SimParams):
|
||||||
|
@property
|
||||||
|
def run(self) -> str:
|
||||||
|
return "46"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_inverter(self) -> bool:
|
||||||
|
return True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def t_last(self) -> float:
|
||||||
|
return 5e-9
|
||||||
|
|
||||||
|
|
||||||
sims = [
|
sims = [
|
||||||
# params, human friendly db name, normalization
|
# params, human friendly db name, normalization
|
||||||
|
@ -247,6 +260,14 @@ sims = [
|
||||||
(SimParams43(4, 2, 600, "1e10"), None, 20000),
|
(SimParams43(4, 2, 600, "1e10"), None, 20000),
|
||||||
(SimParams43(4, 2, 600, "2e10"), None, 20000),
|
(SimParams43(4, 2, 600, "2e10"), None, 20000),
|
||||||
(SimParams43(4, 2, 600, "30000001024e0"), None, 20000), # 3e10
|
(SimParams43(4, 2, 600, "30000001024e0"), None, 20000), # 3e10
|
||||||
|
|
||||||
|
(SimParams46(5, 1, 400, "5e9"), None, 20000),
|
||||||
|
(SimParams46(5, 1, 400, "8e9"), None, 20000),
|
||||||
|
(SimParams46(5, 1, 400, "1e10"), None, 20000),
|
||||||
|
(SimParams46(5, 1, 400, "2e10"), None, 20000),
|
||||||
|
(SimParams46(5, 1, 400, "4e10"), None, 20000),
|
||||||
|
(SimParams46(7, 1, 600, "1e10"), None, 20000),
|
||||||
|
(SimParams46(4, 2, 600, "2e10"), None, 20000),
|
||||||
]
|
]
|
||||||
|
|
||||||
measurements = { real.machine_name: [human, norm, None, None] for (real, human, norm) in sims }
|
measurements = { real.machine_name: [human, norm, None, None] for (real, human, norm) in sims }
|
||||||
|
@ -3581,4 +3602,49 @@ Piecewise(
|
||||||
)
|
)
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
set_meas("46-0.0004rad-5coupling-3_1_winding-5e9-drive", """
|
||||||
|
Piecewise(
|
||||||
|
[
|
||||||
|
[ -16747, -259 ], # -1.0
|
||||||
|
[ 16702, -1813 ], # 1.0
|
||||||
|
]
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
|
set_meas("46-0.0004rad-5coupling-3_1_winding-8e9-drive", """
|
||||||
|
Piecewise(
|
||||||
|
[
|
||||||
|
[ -16810, 9403 ], # -1.0
|
||||||
|
[ 16766, 7366 ], # 1.0
|
||||||
|
]
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
|
set_meas("46-0.0004rad-5coupling-3_1_winding-1e10-drive", """
|
||||||
|
Piecewise(
|
||||||
|
[
|
||||||
|
[ -16834, 15248 ], # -1.0
|
||||||
|
[ 16776, 12945 ], # 1.0
|
||||||
|
]
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
|
set_meas("46-0.00059999997rad-7coupling-3_1_winding-1e10-drive", """
|
||||||
|
Piecewise(
|
||||||
|
[
|
||||||
|
[ -16841, 13439 ], # -1.0
|
||||||
|
[ 16808, 11127 ], # 1.0
|
||||||
|
]
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
|
set_meas("46-0.00059999997rad-4coupling-5_1_winding-2e10-drive", """
|
||||||
|
Piecewise(
|
||||||
|
[
|
||||||
|
[ -16778, 15097 ], # -1.0
|
||||||
|
[ 16802, 12503 ], # 1.0
|
||||||
|
]
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
if __name__ == '__main__': main()
|
if __name__ == '__main__': main()
|
||||||
|
|
|
@ -36,6 +36,7 @@ use coremem::stim::{
|
||||||
TimeVaryingExt as _,
|
TimeVaryingExt as _,
|
||||||
};
|
};
|
||||||
use coremem::Driver;
|
use coremem::Driver;
|
||||||
|
use log::info;
|
||||||
|
|
||||||
// type R = real::R32;
|
// type R = real::R32;
|
||||||
type R = f32;
|
type R = f32;
|
||||||
|
@ -1096,6 +1097,25 @@ fn drive_map_3stack_with_init_44(amp0: f32) -> [[ClockState; 3]; 7] {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
fn drive_map_3stack_with_init_inv_then_buff(amp0: f32) -> [[ClockState; 3]; 5] {
|
||||||
|
use ClockState as C;
|
||||||
|
// amplitudes are inverted from what you would expect.
|
||||||
|
// hold(-1) puts the core into a positive M
|
||||||
|
[
|
||||||
|
// init S0; charge S1 positive, S2 *negative*
|
||||||
|
[C::hold(-amp0), C::hold_low(), C::hold_high()],
|
||||||
|
// let the cores settle; open S1 for receive
|
||||||
|
[C::release(-amp0), C::release_low(), C::hold_high()],
|
||||||
|
// write S0 -> S1.
|
||||||
|
[C::hold_high(), C::float(), C::hold_high()],
|
||||||
|
// open S2 for receive
|
||||||
|
[C::hold_high(), C::float(), C::release_high()],
|
||||||
|
// write S1 -> S2
|
||||||
|
[C::hold_high(), C::hold_high(), C::float()],
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
fn drive_map_4stack_with_init4(amp0: f32, amp1: f32, amp2: f32, amp3: f32) -> [[ClockState; 4]; 3] {
|
fn drive_map_4stack_with_init4(amp0: f32, amp1: f32, amp2: f32, amp3: f32) -> [[ClockState; 4]; 3] {
|
||||||
use ClockState as C;
|
use ClockState as C;
|
||||||
|
@ -1307,6 +1327,41 @@ fn couple_asymmetric_inverter(params: &Params, sender: u32, loops: u32, slot_off
|
||||||
params
|
params
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// couple `sender` to the `sender+1` core by using `loops` loops, without any crossover.
|
||||||
|
/// when sender goes high -> low, receiver goes low -> high ("buffering").
|
||||||
|
/// `loops` must be >= 1.
|
||||||
|
fn couple_asymmetric_buffer(params: &Params, sender: u32, loops: u32, slot_offset: u32, net_slots: u32) -> Params {
|
||||||
|
let c0 = sender;
|
||||||
|
let slots_per_asym = 2*loops;
|
||||||
|
// couple c to c+1
|
||||||
|
let c1 = c0+1;
|
||||||
|
let mut params = params
|
||||||
|
.with_coupling(c0, c1, slot_offset, net_slots, CouplingMethod::direct_half_exterior())
|
||||||
|
.with_coupling(c0, c1, slot_offset + slots_per_asym - 1, net_slots, CouplingMethod::direct_half_interior())
|
||||||
|
;
|
||||||
|
|
||||||
|
// "loops" for receiver c1
|
||||||
|
// this connects the two ends of the input
|
||||||
|
for i in 0..slots_per_asym - 1 {
|
||||||
|
params = params.with_coupling(c1, c1, slot_offset + i, net_slots, CouplingMethod::SelfAngularTop);
|
||||||
|
}
|
||||||
|
|
||||||
|
// loops for sender c0:
|
||||||
|
for i in 0..loops {
|
||||||
|
if i != 0 {
|
||||||
|
// bridge this loop to the previous one
|
||||||
|
params = params.with_coupling(c0, c0, slot_offset + 2*i - 1, net_slots, CouplingMethod::SelfAngularBot);
|
||||||
|
}
|
||||||
|
params = params
|
||||||
|
.with_coupling(c0, c0, slot_offset + 2*i, net_slots, CouplingMethod::SelfLoopHalfInterior)
|
||||||
|
.with_coupling(c0, c0, slot_offset + 2*i, net_slots, CouplingMethod::SelfAngularTop)
|
||||||
|
.with_coupling(c0, c0, slot_offset + 2*i + 1, net_slots, CouplingMethod::SelfLoopHalfExterior)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
params
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
coremem::init_logging();
|
coremem::init_logging();
|
||||||
// coremem::init_debug();
|
// coremem::init_debug();
|
||||||
|
@ -4721,7 +4776,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if true {
|
if false {
|
||||||
let p45xx = params_v2
|
let p45xx = params_v2
|
||||||
.with_clock_phase_duration(ps(1000))
|
.with_clock_phase_duration(ps(1000))
|
||||||
.with_clock_decay(ps(50))
|
.with_clock_decay(ps(50))
|
||||||
|
@ -4809,6 +4864,65 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if true {
|
||||||
|
let p46xx = params_v2
|
||||||
|
.with_clock_phase_duration(ps(1000))
|
||||||
|
.with_clock_decay(ps(50))
|
||||||
|
.with_ctl_conductivity(5e2)
|
||||||
|
.with_coupling_conductivity(5e3)
|
||||||
|
;
|
||||||
|
for init_set in [
|
||||||
|
&[
|
||||||
|
// establish the domain/range
|
||||||
|
1.00,
|
||||||
|
-1.00,
|
||||||
|
][..],
|
||||||
|
&[
|
||||||
|
0.00,
|
||||||
|
0.20,
|
||||||
|
-0.20,
|
||||||
|
0.10,
|
||||||
|
-0.10,
|
||||||
|
0.35,
|
||||||
|
-0.35,
|
||||||
|
][..],
|
||||||
|
] {
|
||||||
|
for (coupling_loops, s0_loops, s_major, cur_flt) in [
|
||||||
|
(5, 1, um(400), 1e10), // verified geom;
|
||||||
|
(7, 1, um(600), 1e10),
|
||||||
|
(5, 1, um(400), 5e9),
|
||||||
|
(4, 2, um(600), 2e10),
|
||||||
|
(5, 1, um(400), 8e9),
|
||||||
|
(5, 1, um(400), 2e10),
|
||||||
|
(5, 1, um(400), 4e10),
|
||||||
|
] {
|
||||||
|
for &init_flt in init_set {
|
||||||
|
// coupling loops (M0 -> M1) + (M1 -> M2) + control slots
|
||||||
|
let slots_per_asym = 2*s0_loops;
|
||||||
|
let net_slots = 2*slots_per_asym + 1;
|
||||||
|
let mut params = p46xx
|
||||||
|
.with_s_major(s_major)
|
||||||
|
.with_coupling_loops(coupling_loops)
|
||||||
|
.with_input_magnitude(cur_flt)
|
||||||
|
// control loops
|
||||||
|
.with_coupling(0, 0, 0, net_slots, CouplingMethod::Control)
|
||||||
|
.with_coupling(1, 1, 0, net_slots, CouplingMethod::Control)
|
||||||
|
.with_coupling(2, 2, 0, net_slots, CouplingMethod::Control)
|
||||||
|
;
|
||||||
|
|
||||||
|
params = couple_asymmetric_inverter(¶ms, 0 /* sender core */, s0_loops, 1 /* slot offset */, net_slots);
|
||||||
|
params = couple_asymmetric_buffer(¶ms, 1 /* sender core */, s0_loops, 1 + slots_per_asym /* slot offset */, net_slots);
|
||||||
|
let name = asymmetric_inverter_name(¶ms, "46", 2*s0_loops + 1, init_flt);
|
||||||
|
run_sim(
|
||||||
|
&name,
|
||||||
|
drive_map_3stack_with_init_inv_then_buff(init_flt),
|
||||||
|
params,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4859,6 +4973,8 @@ fn run_sim<const C: usize, const R: usize>(
|
||||||
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);
|
||||||
|
|
||||||
|
info!("populating initial geometry");
|
||||||
|
|
||||||
driver.add_classical_boundary(sim_padding);
|
driver.add_classical_boundary(sim_padding);
|
||||||
|
|
||||||
//////// create the wires and toroids
|
//////// create the wires and toroids
|
||||||
|
@ -4906,6 +5022,8 @@ fn run_sim<const C: usize, const R: usize>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info!("populating measurements and stimui");
|
||||||
|
|
||||||
//////// monitor some measurements
|
//////// monitor some measurements
|
||||||
if params.hardcoded_control_and_sense {
|
if params.hardcoded_control_and_sense {
|
||||||
for core in 0..num_cores {
|
for core in 0..num_cores {
|
||||||
|
@ -4990,6 +5108,7 @@ fn run_sim<const C: usize, const R: usize>(
|
||||||
driver.add_stimulus(s);
|
driver.add_stimulus(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info!("launching sim");
|
||||||
driver.step_until(duration_frames);
|
driver.step_until(duration_frames);
|
||||||
println!("sim complete");
|
info!("sim complete");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue