Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions script-gen-manager/src/instr_metadata/mpsu50_metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ impl Mpsu50Metadata {
base.add_range("source.levelv".to_string(), -50.0, 50.0);
base.add_range("source.leveli".to_string(), -5.0, 5.0);

base.add_range("source.limiti".to_string(), 0.01, 5.1);

// Add region maps
// when pulse mode is off
let exclude_i = NumberLimit::new(-10.0e-9, 10.0e-9, false, None);
Expand Down
6 changes: 5 additions & 1 deletion script-gen-manager/src/instr_metadata/msmu60_metadata.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::model::{
chan_data::region_map::RegionMapMetadata, sweep_data::number_limit::NumberLimit,
chan_data::region_map::RegionMapMetadata,
sweep_data::{number_limit::NumberLimit, parameters::ParameterFloat},
};

use super::base_metadata::{BaseMetadata, Metadata};
Expand Down Expand Up @@ -42,6 +43,9 @@ impl Msmu60Metadata {
base.add_range("source.levelv".to_string(), -60.0, 60.0);
base.add_range("source.leveli".to_string(), -1.5, 1.5);

base.add_range("source.limiti".to_string(), -1e-8, 1.515);
base.add_range("source.limitv".to_string(), -0.02, 60.6);

// Add region maps
// when pulse mode is off
let exclude_v = Some(NumberLimit::new(-0.01, 0.01, false, None));
Expand Down
6 changes: 0 additions & 6 deletions script-gen-manager/src/model/chan_data/bias_channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,12 @@ impl BiasChannel {

// Call set_defaults on the common_chan_attributes field
bias_channel.common_chan_attributes.set_defaults();
bias_channel
.common_chan_attributes
.update_region_constraints(bias_channel.bias.value, bias_channel.bias.value);

bias_channel
}

pub fn evaluate(&mut self) {
self.common_chan_attributes.evaluate();
self.determine_bias_value();
self.common_chan_attributes
.update_region_constraints(self.bias.value, self.bias.value);
}

fn determine_bias_value(&mut self) {
Expand Down
132 changes: 32 additions & 100 deletions script-gen-manager/src/model/chan_data/default_channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub struct CommonChanAttributes {
pub meas_function: ParameterString,
pub source_range: ChannelRange,
meas_range: ChannelRange,
pub source_limiti: ParameterFloat,
pub source_limiti: Option<ParameterFloat>,
pub source_limitv: Option<ParameterFloat>,
pub sense_mode: Option<ParameterString>,

Expand All @@ -40,11 +40,7 @@ impl CommonChanAttributes {
meas_function: ParameterString::new("meas_function"),
source_range: ChannelRange::new(),
meas_range: ChannelRange::new(),
source_limiti: ParameterFloat::new(
"source_limiti",
1e-1,
Some(BaseMetadata::UNIT_AMPERES.to_string()),
),
source_limiti: None,
source_limitv: None,
sense_mode: None,

Expand All @@ -66,9 +62,19 @@ impl CommonChanAttributes {
20.0,
Some(BaseMetadata::UNIT_VOLTS.to_string()),
));
self.source_limiti = Some(ParameterFloat::new(
"source_limiti",
1e-1,
Some(BaseMetadata::UNIT_AMPERES.to_string()),
));
}
DeviceType::Psu => {
self.source_function.range = vec![BaseMetadata::FUNCTION_VOLTAGE.to_string()];
self.source_limiti = Some(ParameterFloat::new(
"source_limiti",
0.5,
Some(BaseMetadata::UNIT_AMPERES.to_string()),
));
}
DeviceType::Unknown => {
//todo: handle error
Expand Down Expand Up @@ -101,6 +107,7 @@ impl CommonChanAttributes {
self.set_source_range(&device_metadata);
self.set_source_range_limits(&device_metadata);
self.set_source_range_value();
self.validate_source_limits(&device_metadata);
}

fn set_source_range(&mut self, metadata: &MetadataEnum) {
Expand Down Expand Up @@ -243,102 +250,27 @@ impl CommonChanAttributes {
Some(sense_mode)
}

pub fn update_region_constraints(&mut self, min_value: f64, max_value: f64) -> bool {
let mut changed = false;
let mut region_id = -1;

match self.device.device_type {
DeviceType::Smu => {
if let Some(region_map) =
self.get_region_map(&self.device.get_metadata(), "smu.region")
{
let mut value = 0.0;
if self.source_range.is_range_auto()
|| self.source_range.is_range_follow_limiti()
{
value = if min_value.abs() > max_value.abs() {
min_value
} else {
max_value
};
} else {
if let Some(res) = self.source_range.get_scaled_value() {
value = res
}
}

let old_id = region_id;
let old_limiti = self.source_limiti.value;
let old_limitv = self
.source_limitv
.as_ref()
.map(|v| v.value)
.unwrap_or(f64::NAN);

if self.source_function.value == BaseMetadata::FUNCTION_VOLTAGE.to_string() {
let source_limit_ilimits = region_map.get_current_limit(value);
self.source_limiti.value =
source_limit_ilimits.limit(self.source_limiti.value);
region_id = region_map.find_region(value, self.source_limiti.value);
} else {
let source_limit_vlimits = region_map.get_voltage_limit(value);
if let Some(ref mut limitv) = self.source_limitv {
limitv.value = source_limit_vlimits.limit(limitv.value);
region_id = region_map.find_region(limitv.value, value);
}
}

if (region_id != old_id)
|| (old_limiti != self.source_limiti.value)
|| (old_limitv
!= self
.source_limitv
.as_ref()
.map(|v| v.value)
.unwrap_or(f64::NAN))
{
changed = true;
}
}
}
DeviceType::Psu => {
if let Some(region_map) =
self.get_region_map(&self.device.get_metadata(), "psu.region")
{
let mut value = 0.0;
if self.source_range.is_range_auto()
|| self.source_range.is_range_follow_limiti()
{
value = if min_value.abs() > max_value.abs() {
min_value
} else {
max_value
};
} else {
if let Some(res) = self.source_range.get_scaled_value() {
value = res
}
}

let old_id = region_id;
let old_limiti = self.source_limiti.value;

if self.source_function.value == BaseMetadata::FUNCTION_VOLTAGE.to_string() {
let source_limit_ilimits = region_map.get_current_limit(value);
self.source_limiti.value =
source_limit_ilimits.limit(self.source_limiti.value);
region_id = region_map.find_region(value, self.source_limiti.value);
}

if (region_id != old_id) || (old_limiti != self.source_limiti.value) {
changed = true;
}
}
pub fn validate_source_limits(&mut self, metadata: &MetadataEnum) {
if let Some((min, max)) = self.get_range_limits(metadata, "source.limiti") {
if let Some(ref mut limiti) = self.source_limiti {
limiti.value = Self::limit(limiti.value, min, max);
}
DeviceType::Unknown => {
//todo: handle error
}
if let Some((min, max)) = self.get_range_limits(metadata, "source.limitv") {
if let Some(ref mut limitv) = self.source_limitv {
limitv.value = Self::limit(limitv.value, min, max);
}
}
changed
}

fn limit(mut value: f64, min: f64, max: f64) -> f64 {
if value >= min && value <= max {
return value;
} else if value < min {
value = min
} else {
value = max
}
return value;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ impl StartStopChannel {
BaseMetadata::STYLE_LOG.to_string(),
];
self.style.value = BaseMetadata::STYLE_LIN.to_string();
self.common_chan_attributes
.update_region_constraints(self.start.value, self.stop.value);
self.set_list(steps_or_points);
}

Expand All @@ -65,8 +63,6 @@ impl StartStopChannel {
self.common_chan_attributes.evaluate();
self.determine_start_value();
self.determine_stop_value();
self.common_chan_attributes
.update_region_constraints(self.start.value, self.stop.value);

//List evaluation

Expand Down
59 changes: 35 additions & 24 deletions script-gen-manager/src/script_component/sweep.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,15 @@ impl SweepModel {
.insert(instr_name.clone() + ":LIMITV", String::from("nil"));
}

self.val_replacement_map.insert(
instr_name.clone() + ":LIMITI",
self.format(bias_channel.common_chan_attributes.source_limiti.value),
);
if let Some(source_limiti) = &bias_channel.common_chan_attributes.source_limiti {
self.val_replacement_map.insert(
instr_name.clone() + ":LIMITI",
self.format(source_limiti.value),
);
} else {
self.val_replacement_map
.insert(instr_name.clone() + ":LIMITI", String::from("nil"));
}

self.val_replacement_map.insert(
instr_name.clone() + ":BIAS",
Expand Down Expand Up @@ -283,16 +288,19 @@ impl SweepModel {
.insert(instr_name.clone() + ":LIMITV", String::from("nil"));
}

self.val_replacement_map.insert(
instr_name.clone() + ":LIMITI",
self.format(
step_channel
.start_stop_channel
.common_chan_attributes
.source_limiti
.value,
),
);
if let Some(source_limiti) = &step_channel
.start_stop_channel
.common_chan_attributes
.source_limiti
{
self.val_replacement_map.insert(
instr_name.clone() + ":LIMITI",
self.format(source_limiti.value),
);
} else {
self.val_replacement_map
.insert(instr_name.clone() + ":LIMITI", String::from("nil"));
}

self.val_replacement_map.insert(
instr_name.clone() + ":START",
Expand Down Expand Up @@ -479,16 +487,19 @@ impl SweepModel {
.insert(instr_name.clone() + ":LIMITV", String::from("nil"));
}

self.val_replacement_map.insert(
instr_name.clone() + ":LIMITI",
self.format(
sweep_channel
.start_stop_channel
.common_chan_attributes
.source_limiti
.value,
),
);
if let Some(source_limiti) = &sweep_channel
.start_stop_channel
.common_chan_attributes
.source_limiti
{
self.val_replacement_map.insert(
instr_name.clone() + ":LIMITI",
self.format(source_limiti.value),
);
} else {
self.val_replacement_map
.insert(instr_name.clone() + ":LIMITI", String::from("nil"));
}

self.val_replacement_map.insert(
instr_name.clone() + ":START",
Expand Down
Loading