fdtd-coremem/crates/applications/stacked_cores/scripts/plot_inverters.py

168 lines
7.7 KiB
Python
Executable File

#!/usr/bin/env python3
from fake_cores_db import *
from stacked_cores_40xx_db import *
class SimParamsCascaded(SimParams):
def __init__(self, p1: SimParams, p2: SimParams):
super().__init__(p1.couplings, p1.wrappings_spec, p1.um, p1.drive_str)
self.p1 = p1
self.p2 = p2
@property
def is_inverter(self) -> bool:
return self.p1.is_inverter ^ self.p2.is_inverter
@property
def human_name(self) -> str:
return f"Cascade: {self.p1.human_name} -> {self.p2.human_name}"
# plot pre-40xx sims
for (name, curve) in [
# ("fake step", fwd_fake_step.logically_inverted()),
# ("fake 1.5x", fwd_fake_1_5x.logically_inverted()),
# ("fake slope-change", fwd_fake_slope_change_before_0_5.logically_inverted()),
# ("fake slope-change (delayed)", fwd_fake_slope_change_after_0_5.logically_inverted()),
# ("fake slope-change (delayed, shifted)", fwd_fake_slope_change_after_0_5.shifted_x(-0.1).logically_inverted()),
# ("fake slope-change (delayed, shifted, inv-xy)", fwd_fake_slope_change_after_0_5.shifted_x(-0.1).shifted_y(-0.2).logically_inverted_x()),
# ("fake slope-change (delayed, flipped)", fwd_fake_slope_change_after_0_5.logically_inverted_x().logically_inverted()),
# ("fake hill", fwd_fake_hill.logically_inverted()),
# ("fake asymmetric hill", fwd_fake_asymmetric_hill.logically_inverted()),
# ("fake asymmetric flats", fwd_fake_asymmetric_flats.logically_inverted()),
# ("fake asymmetric overdrive", fwd_fake_asymmetric_overdrive.logically_inverted()),
# ("fake asymmetric bottom out", fwd_fake_asymmetric_bottom_out.logically_inverted()),
# ("18", fwd_18.logically_inverted()),
# ("24 5:1 (2e10 I)", fwd_24_5_1_2e10.logically_inverted()),
# ("24 5:1 (5e10 I)", fwd_24_5_1_5e10.logically_inverted()),
# ("24 5:1 (8e10 I)", fwd_24_5_1_8e10.logically_inverted()),
# ("26", fwd_26.logically_inverted()),
# ("38 1:0 (2e10 I)", fwd_38_1_0.logically_inverted()),
# ("38 1:0 (5e10 I)", fwd_38_1_0_5e10.logically_inverted()),
# ("38 2:0 (2e10 I)", fwd_38_2_0.logically_inverted()),
# ("38 2:0 (5e10 I)", fwd_38_2_0_5e10.logically_inverted()),
# ("38 3:0 (2e10 I)", fwd_38_3_0.logically_inverted()),
# ("38 3:0 (5e10 I)", fwd_38_3_0_5e10.logically_inverted()),
# ("38 4:0 (2e10 I)", fwd_38_4_0.logically_inverted()),
# ("38 4:0 (5e10 I)", fwd_38_4_0_5e10.logically_inverted()),
# ("39 2:0 (2e10 I)", inv_39_2_0_2e10),
# ("39 2:0 (5e10 I)", inv_39_2_0_5e10),
# ("39 2:0 (8e10 I)", inv_39_2_0_8e10),
# ("39 2:0 (1e11 I)", inv_39_2_0_1e11),
# ("39 2:0 (15e10 I)", inv_39_2_0_15e10),
]:
curve.plot(title = f"{name} mapping")
curve.logically_inverted().plot_slope(title = f"{name} slope")
curve.plot_equilibrium(title = f"{name} equilibrium")
# curve.plot_integral(title = f"{name} integrated")
of_interest = []
# plot select stims:
# of_interest += filter_meas(rad_um=800, drive=5e10, couplings=12, wrappings=5)
# of_interest += filter_meas(rad_um=800, drive=5e10, couplings=8, wrappings=11)
# of_interest += filter_meas(rad_um=800, drive=5e10, couplings=12, wrappings=7)
# of_interest += filter_meas(rad_um=800, drive=5e10, couplings=12, wrappings=5)
# of_interest += filter_meas(rad_um=800, drive=5e10, couplings=10, wrappings=9)
# of_interest += filter_meas(rad_um=800, drive=1e11, couplings=18, wrappings=5)
# of_interest += filter_meas(rad_um=800, drive=1e11, couplings=12, wrappings=7)
# of_interest += filter_meas(rad_um=800, drive=1e11, couplings=24, wrappings=3)
# of_interest += [(p, c.shifted_y(-0.13)) for (p, c) in filter_meas(rad_um=800, drive=1e11, couplings=12, wrappings=7)]
# of_interest += filter_meas(run="40", rad_um=800, drive=1e11, couplings=8, wrappings=11)
# of_interest += filter_meas(run="40", rad_um=800, drive=1e11, couplings=10, wrappings=9)
# of_interest += filter_meas(run="40", rad_um=1200, drive=1e11, couplings=12, wrappings=9)
# of_interest += filter_meas(run="40", rad_um=1200, drive=1e11, couplings=10, wrappings=11)
# of_interest += filter_meas(run="40", rad_um=1200, drive=2e11, couplings=12, wrappings=9)
# of_interest += filter_meas(run="41", viable_inverter=True)
# of_interest = [
# (p, c) for (p, c) in of_interest if p not in [
# SimParams41(9, 3, 600, "3e9"),
# SimParams41(9, 1, 400, "3e9"),
# SimParams41(10, 3, 800, "25e8"),
# SimParams41(9, 1, 400, "2e9"),
# SimParams41(10, 3, 800, "2e9"),
# SimParams41(10, 3, 800, "3e9"),
# SimParams41(10, 3, 800, "1e9"),
# SimParams41(10, 3, 800, "5e9"),
# SimParams41(10, 3, 800, "5e10"),
# SimParams41(9, 3, 600, "1e10"),
# SimParams41(9, 1, 400, "2e10"),
# ]
# ]
of_interest += [(p, get_meas(p)) for p in
[
# SimParams41(4, 3, 400, "2e10"),
# SimParams41(4, 3, 400, "4e10"),
# SimParams41(16, 2, 800, "2e10"),
# SimParams41(18, 1, 600, "3e9"),
# SimParams41(18, 1, 600, "5e9"),
# SimParams41(18, 1, 600, "1e10"),
# SimParams41(18, 1, 600, "2e10"),
# SimParams41(4, 3, 400, "1e10"),
# SimParams41(9, 1, 400, "1e10"),
# SimParams41(12, 2, 600, "1e10"),
# SimParams41(12, 2, 600, "5e9"),
# SimParams41(10, 3, 800, "2e10"),
# SimParams41(6, 2, 400, "1e10"),
# SimParams41(9, 3, 600, "2e10"),
# SimParams41(10, 3, 800, "1e10"),
# SimParams41(24, 1, 800, "3e9"),
# SimParams41(24, 1, 800, "5e9"),
# SimParams41(16, 2, 800, "1e10"),
# SimParams41(24, 2, 1200, "5e9"),
# SimParams41(24, 2, 1200, "1e10"),
# SimParams41(36, 1, 1200, "5e9"),
# SimParams41(36, 1, 1200, "4e9"),
# SimParams41(36, 1, 1200, "3e9"),
# # SimParams41(9, 1, 400, "5e9"),
# SimParams41(18, 0, 400, "1e10"),
# SimParams41(18, 0, 400, "5e9"),
# SimParams41(9, 1, 400, "5e9"),
# SimParams41(9, 1, 400, "1e10"),
# SimParams41(9, 1, 400, "2e10"),
] if get_meas(p)
]
# plot all viable inverters
of_interest += filter_meas(run="40")
# 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=9)
# of_interest += filter_meas(run="42", rad_um=400, couplings=2)
# of_interest += filter_meas(run="42", rad_um=400, couplings=6)
# of_interest += filter_meas(run="43")
# plot cascaded inverter -> buffer
# for (inv_p, inv_curve) in filter_meas(is_inverter=True):
# 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].get_range()) # output range
# 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]:
curve.plot(title = f"{params.human_name} mapping")
curve.plot_slope(title = f"{params.human_name} slope")
# if not params.is_inverter:
# curve = curve.logically_inverted()
if params.is_inverter:
curve.plot_equilibrium(title = f"{params.human_name} equilibrium")