From bc6ed6b35d28218114801e11ae98566cc19e5e4d Mon Sep 17 00:00:00 2001 From: "GLOBAL\\rjha" Date: Tue, 30 Sep 2025 16:13:05 +0530 Subject: [PATCH 1/4] fixing source limit for PSU and SMU --- .../src/instr_metadata/mpsu50_metadata.rs | 2 + .../src/instr_metadata/msmu60_metadata.rs | 5 +- .../src/model/chan_data/default_channel.rs | 228 ++++++++++-------- .../src/script_component/sweep.rs | 51 ++-- 4 files changed, 163 insertions(+), 123 deletions(-) diff --git a/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs b/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs index 279477a..5d4d162 100644 --- a/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs +++ b/script-gen-manager/src/instr_metadata/mpsu50_metadata.rs @@ -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); diff --git a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs index 2cce204..49404cc 100644 --- a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs +++ b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs @@ -1,5 +1,5 @@ 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}; @@ -41,6 +41,9 @@ impl Msmu60Metadata { // Add ranges 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.5); + base.add_range("source.limitv".to_string(), -0.02, 60.0); // Add region maps // when pulse mode is off diff --git a/script-gen-manager/src/model/chan_data/default_channel.rs b/script-gen-manager/src/model/chan_data/default_channel.rs index 9903966..e62088e 100644 --- a/script-gen-manager/src/model/chan_data/default_channel.rs +++ b/script-gen-manager/src/model/chan_data/default_channel.rs @@ -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, pub source_limitv: Option, pub sense_mode: Option, @@ -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, @@ -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 @@ -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) { @@ -243,102 +250,127 @@ impl CommonChanAttributes { Some(sense_mode) } + 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); + } + } + 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); + } + } + + } + + 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; + } + 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; - } - } - } - DeviceType::Unknown => { - //todo: handle error - } - } + // 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; + // } + // } + // } + // DeviceType::Unknown => { + // //todo: handle error + // } + // } changed } } diff --git a/script-gen-manager/src/script_component/sweep.rs b/script-gen-manager/src/script_component/sweep.rs index f31256f..dcce2c8 100644 --- a/script-gen-manager/src/script_component/sweep.rs +++ b/script-gen-manager/src/script_component/sweep.rs @@ -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_limitv { + 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", @@ -283,16 +288,15 @@ 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_limitv { + 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", @@ -479,16 +483,15 @@ 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_limitv { + 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", From b12b252e9ce0ae3bc658a3b83cd62600cf9fcb1b Mon Sep 17 00:00:00 2001 From: "GLOBAL\\rjha" Date: Tue, 30 Sep 2025 16:16:53 +0530 Subject: [PATCH 2/4] cargo fmt --- .../src/instr_metadata/msmu60_metadata.rs | 5 +++-- .../src/model/chan_data/default_channel.rs | 5 ++--- script-gen-manager/src/script_component/sweep.rs | 12 ++++++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs index 49404cc..152cab7 100644 --- a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs +++ b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs @@ -1,5 +1,6 @@ use crate::model::{ - chan_data::region_map::RegionMapMetadata, sweep_data::{number_limit::NumberLimit, parameters::ParameterFloat}, + chan_data::region_map::RegionMapMetadata, + sweep_data::{number_limit::NumberLimit, parameters::ParameterFloat}, }; use super::base_metadata::{BaseMetadata, Metadata}; @@ -41,7 +42,7 @@ impl Msmu60Metadata { // Add ranges 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.5); base.add_range("source.limitv".to_string(), -0.02, 60.0); diff --git a/script-gen-manager/src/model/chan_data/default_channel.rs b/script-gen-manager/src/model/chan_data/default_channel.rs index e62088e..39f229b 100644 --- a/script-gen-manager/src/model/chan_data/default_channel.rs +++ b/script-gen-manager/src/model/chan_data/default_channel.rs @@ -250,7 +250,7 @@ impl CommonChanAttributes { Some(sense_mode) } - pub fn validate_source_limits(&mut self, metadata: &MetadataEnum){ + 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); @@ -261,10 +261,9 @@ impl CommonChanAttributes { limitv.value = Self::limit(limitv.value, min, max); } } - } - fn limit(mut value:f64, min: f64, max: f64)->f64 { + fn limit(mut value: f64, min: f64, max: f64) -> f64 { if value >= min && value <= max { return value; } else if value < min { diff --git a/script-gen-manager/src/script_component/sweep.rs b/script-gen-manager/src/script_component/sweep.rs index dcce2c8..0218334 100644 --- a/script-gen-manager/src/script_component/sweep.rs +++ b/script-gen-manager/src/script_component/sweep.rs @@ -288,7 +288,11 @@ impl SweepModel { .insert(instr_name.clone() + ":LIMITV", String::from("nil")); } - if let Some(source_limiti) = &step_channel.start_stop_channel.common_chan_attributes.source_limitv { + if let Some(source_limiti) = &step_channel + .start_stop_channel + .common_chan_attributes + .source_limitv + { self.val_replacement_map.insert( instr_name.clone() + ":LIMITI", self.format(source_limiti.value), @@ -483,7 +487,11 @@ impl SweepModel { .insert(instr_name.clone() + ":LIMITV", String::from("nil")); } - if let Some(source_limiti) = &sweep_channel.start_stop_channel.common_chan_attributes.source_limitv { + if let Some(source_limiti) = &sweep_channel + .start_stop_channel + .common_chan_attributes + .source_limitv + { self.val_replacement_map.insert( instr_name.clone() + ":LIMITI", self.format(source_limiti.value), From d83140341baa91a09f879930356b5899d92ac281 Mon Sep 17 00:00:00 2001 From: "GLOBAL\\rjha" Date: Tue, 30 Sep 2025 16:33:27 +0530 Subject: [PATCH 3/4] correct value should be update in script --- script-gen-manager/src/script_component/sweep.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/script-gen-manager/src/script_component/sweep.rs b/script-gen-manager/src/script_component/sweep.rs index 0218334..e9ae175 100644 --- a/script-gen-manager/src/script_component/sweep.rs +++ b/script-gen-manager/src/script_component/sweep.rs @@ -156,7 +156,7 @@ impl SweepModel { .insert(instr_name.clone() + ":LIMITV", String::from("nil")); } - if let Some(source_limiti) = &bias_channel.common_chan_attributes.source_limitv { + 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), @@ -291,7 +291,7 @@ impl SweepModel { if let Some(source_limiti) = &step_channel .start_stop_channel .common_chan_attributes - .source_limitv + .source_limiti { self.val_replacement_map.insert( instr_name.clone() + ":LIMITI", @@ -490,7 +490,7 @@ impl SweepModel { if let Some(source_limiti) = &sweep_channel .start_stop_channel .common_chan_attributes - .source_limitv + .source_limiti { self.val_replacement_map.insert( instr_name.clone() + ":LIMITI", From ba40a6bacf2b7468d84c99f2bac866437f1e7871 Mon Sep 17 00:00:00 2001 From: "GLOBAL\\rjha" Date: Fri, 3 Oct 2025 17:19:50 +0530 Subject: [PATCH 4/4] removing region function for now, once region constraints have been understand and implemented , we will try to handle this limit if its required Also correcting SMU limit for overrange case --- .../src/instr_metadata/msmu60_metadata.rs | 4 +- .../src/model/chan_data/bias_channel.rs | 6 -- .../src/model/chan_data/default_channel.rs | 99 ------------------- .../src/model/chan_data/start_stop_channel.rs | 4 - 4 files changed, 2 insertions(+), 111 deletions(-) diff --git a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs index 152cab7..e8deb9c 100644 --- a/script-gen-manager/src/instr_metadata/msmu60_metadata.rs +++ b/script-gen-manager/src/instr_metadata/msmu60_metadata.rs @@ -43,8 +43,8 @@ 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.5); - base.add_range("source.limitv".to_string(), -0.02, 60.0); + 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 diff --git a/script-gen-manager/src/model/chan_data/bias_channel.rs b/script-gen-manager/src/model/chan_data/bias_channel.rs index 75f5e5d..621d265 100644 --- a/script-gen-manager/src/model/chan_data/bias_channel.rs +++ b/script-gen-manager/src/model/chan_data/bias_channel.rs @@ -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) { diff --git a/script-gen-manager/src/model/chan_data/default_channel.rs b/script-gen-manager/src/model/chan_data/default_channel.rs index 39f229b..748ee71 100644 --- a/script-gen-manager/src/model/chan_data/default_channel.rs +++ b/script-gen-manager/src/model/chan_data/default_channel.rs @@ -273,103 +273,4 @@ impl CommonChanAttributes { } return value; } - - 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; - // } - // } - // } - // DeviceType::Unknown => { - // //todo: handle error - // } - // } - changed - } } diff --git a/script-gen-manager/src/model/chan_data/start_stop_channel.rs b/script-gen-manager/src/model/chan_data/start_stop_channel.rs index 6ac7645..81c6106 100644 --- a/script-gen-manager/src/model/chan_data/start_stop_channel.rs +++ b/script-gen-manager/src/model/chan_data/start_stop_channel.rs @@ -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); } @@ -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