Skip to content

Commit 074496a

Browse files
authored
fixing source limit for PSU and SMU (#18)
1 parent d5beb48 commit 074496a

File tree

6 files changed

+74
-135
lines changed

6 files changed

+74
-135
lines changed

script-gen-manager/src/instr_metadata/mpsu50_metadata.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ impl Mpsu50Metadata {
2525
base.add_range("source.levelv".to_string(), -50.0, 50.0);
2626
base.add_range("source.leveli".to_string(), -5.0, 5.0);
2727

28+
base.add_range("source.limiti".to_string(), 0.01, 5.1);
29+
2830
// Add region maps
2931
// when pulse mode is off
3032
let exclude_i = NumberLimit::new(-10.0e-9, 10.0e-9, false, None);

script-gen-manager/src/instr_metadata/msmu60_metadata.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::model::{
2-
chan_data::region_map::RegionMapMetadata, sweep_data::number_limit::NumberLimit,
2+
chan_data::region_map::RegionMapMetadata,
3+
sweep_data::{number_limit::NumberLimit, parameters::ParameterFloat},
34
};
45

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

46+
base.add_range("source.limiti".to_string(), -1e-8, 1.515);
47+
base.add_range("source.limitv".to_string(), -0.02, 60.6);
48+
4549
// Add region maps
4650
// when pulse mode is off
4751
let exclude_v = Some(NumberLimit::new(-0.01, 0.01, false, None));

script-gen-manager/src/model/chan_data/bias_channel.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,12 @@ impl BiasChannel {
2121

2222
// Call set_defaults on the common_chan_attributes field
2323
bias_channel.common_chan_attributes.set_defaults();
24-
bias_channel
25-
.common_chan_attributes
26-
.update_region_constraints(bias_channel.bias.value, bias_channel.bias.value);
27-
2824
bias_channel
2925
}
3026

3127
pub fn evaluate(&mut self) {
3228
self.common_chan_attributes.evaluate();
3329
self.determine_bias_value();
34-
self.common_chan_attributes
35-
.update_region_constraints(self.bias.value, self.bias.value);
3630
}
3731

3832
fn determine_bias_value(&mut self) {

script-gen-manager/src/model/chan_data/default_channel.rs

Lines changed: 32 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub struct CommonChanAttributes {
2020
pub meas_function: ParameterString,
2121
pub source_range: ChannelRange,
2222
meas_range: ChannelRange,
23-
pub source_limiti: ParameterFloat,
23+
pub source_limiti: Option<ParameterFloat>,
2424
pub source_limitv: Option<ParameterFloat>,
2525
pub sense_mode: Option<ParameterString>,
2626

@@ -40,11 +40,7 @@ impl CommonChanAttributes {
4040
meas_function: ParameterString::new("meas_function"),
4141
source_range: ChannelRange::new(),
4242
meas_range: ChannelRange::new(),
43-
source_limiti: ParameterFloat::new(
44-
"source_limiti",
45-
1e-1,
46-
Some(BaseMetadata::UNIT_AMPERES.to_string()),
47-
),
43+
source_limiti: None,
4844
source_limitv: None,
4945
sense_mode: None,
5046

@@ -66,9 +62,19 @@ impl CommonChanAttributes {
6662
20.0,
6763
Some(BaseMetadata::UNIT_VOLTS.to_string()),
6864
));
65+
self.source_limiti = Some(ParameterFloat::new(
66+
"source_limiti",
67+
1e-1,
68+
Some(BaseMetadata::UNIT_AMPERES.to_string()),
69+
));
6970
}
7071
DeviceType::Psu => {
7172
self.source_function.range = vec![BaseMetadata::FUNCTION_VOLTAGE.to_string()];
73+
self.source_limiti = Some(ParameterFloat::new(
74+
"source_limiti",
75+
0.5,
76+
Some(BaseMetadata::UNIT_AMPERES.to_string()),
77+
));
7278
}
7379
DeviceType::Unknown => {
7480
//todo: handle error
@@ -101,6 +107,7 @@ impl CommonChanAttributes {
101107
self.set_source_range(&device_metadata);
102108
self.set_source_range_limits(&device_metadata);
103109
self.set_source_range_value();
110+
self.validate_source_limits(&device_metadata);
104111
}
105112

106113
fn set_source_range(&mut self, metadata: &MetadataEnum) {
@@ -243,102 +250,27 @@ impl CommonChanAttributes {
243250
Some(sense_mode)
244251
}
245252

246-
pub fn update_region_constraints(&mut self, min_value: f64, max_value: f64) -> bool {
247-
let mut changed = false;
248-
let mut region_id = -1;
249-
250-
match self.device.device_type {
251-
DeviceType::Smu => {
252-
if let Some(region_map) =
253-
self.get_region_map(&self.device.get_metadata(), "smu.region")
254-
{
255-
let mut value = 0.0;
256-
if self.source_range.is_range_auto()
257-
|| self.source_range.is_range_follow_limiti()
258-
{
259-
value = if min_value.abs() > max_value.abs() {
260-
min_value
261-
} else {
262-
max_value
263-
};
264-
} else {
265-
if let Some(res) = self.source_range.get_scaled_value() {
266-
value = res
267-
}
268-
}
269-
270-
let old_id = region_id;
271-
let old_limiti = self.source_limiti.value;
272-
let old_limitv = self
273-
.source_limitv
274-
.as_ref()
275-
.map(|v| v.value)
276-
.unwrap_or(f64::NAN);
277-
278-
if self.source_function.value == BaseMetadata::FUNCTION_VOLTAGE.to_string() {
279-
let source_limit_ilimits = region_map.get_current_limit(value);
280-
self.source_limiti.value =
281-
source_limit_ilimits.limit(self.source_limiti.value);
282-
region_id = region_map.find_region(value, self.source_limiti.value);
283-
} else {
284-
let source_limit_vlimits = region_map.get_voltage_limit(value);
285-
if let Some(ref mut limitv) = self.source_limitv {
286-
limitv.value = source_limit_vlimits.limit(limitv.value);
287-
region_id = region_map.find_region(limitv.value, value);
288-
}
289-
}
290-
291-
if (region_id != old_id)
292-
|| (old_limiti != self.source_limiti.value)
293-
|| (old_limitv
294-
!= self
295-
.source_limitv
296-
.as_ref()
297-
.map(|v| v.value)
298-
.unwrap_or(f64::NAN))
299-
{
300-
changed = true;
301-
}
302-
}
303-
}
304-
DeviceType::Psu => {
305-
if let Some(region_map) =
306-
self.get_region_map(&self.device.get_metadata(), "psu.region")
307-
{
308-
let mut value = 0.0;
309-
if self.source_range.is_range_auto()
310-
|| self.source_range.is_range_follow_limiti()
311-
{
312-
value = if min_value.abs() > max_value.abs() {
313-
min_value
314-
} else {
315-
max_value
316-
};
317-
} else {
318-
if let Some(res) = self.source_range.get_scaled_value() {
319-
value = res
320-
}
321-
}
322-
323-
let old_id = region_id;
324-
let old_limiti = self.source_limiti.value;
325-
326-
if self.source_function.value == BaseMetadata::FUNCTION_VOLTAGE.to_string() {
327-
let source_limit_ilimits = region_map.get_current_limit(value);
328-
self.source_limiti.value =
329-
source_limit_ilimits.limit(self.source_limiti.value);
330-
region_id = region_map.find_region(value, self.source_limiti.value);
331-
}
332-
333-
if (region_id != old_id) || (old_limiti != self.source_limiti.value) {
334-
changed = true;
335-
}
336-
}
253+
pub fn validate_source_limits(&mut self, metadata: &MetadataEnum) {
254+
if let Some((min, max)) = self.get_range_limits(metadata, "source.limiti") {
255+
if let Some(ref mut limiti) = self.source_limiti {
256+
limiti.value = Self::limit(limiti.value, min, max);
337257
}
338-
DeviceType::Unknown => {
339-
//todo: handle error
258+
}
259+
if let Some((min, max)) = self.get_range_limits(metadata, "source.limitv") {
260+
if let Some(ref mut limitv) = self.source_limitv {
261+
limitv.value = Self::limit(limitv.value, min, max);
340262
}
341263
}
342-
changed
264+
}
265+
266+
fn limit(mut value: f64, min: f64, max: f64) -> f64 {
267+
if value >= min && value <= max {
268+
return value;
269+
} else if value < min {
270+
value = min
271+
} else {
272+
value = max
273+
}
274+
return value;
343275
}
344276
}

script-gen-manager/src/model/chan_data/start_stop_channel.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ impl StartStopChannel {
4242
BaseMetadata::STYLE_LOG.to_string(),
4343
];
4444
self.style.value = BaseMetadata::STYLE_LIN.to_string();
45-
self.common_chan_attributes
46-
.update_region_constraints(self.start.value, self.stop.value);
4745
self.set_list(steps_or_points);
4846
}
4947

@@ -65,8 +63,6 @@ impl StartStopChannel {
6563
self.common_chan_attributes.evaluate();
6664
self.determine_start_value();
6765
self.determine_stop_value();
68-
self.common_chan_attributes
69-
.update_region_constraints(self.start.value, self.stop.value);
7066

7167
//List evaluation
7268

script-gen-manager/src/script_component/sweep.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,15 @@ impl SweepModel {
156156
.insert(instr_name.clone() + ":LIMITV", String::from("nil"));
157157
}
158158

159-
self.val_replacement_map.insert(
160-
instr_name.clone() + ":LIMITI",
161-
self.format(bias_channel.common_chan_attributes.source_limiti.value),
162-
);
159+
if let Some(source_limiti) = &bias_channel.common_chan_attributes.source_limiti {
160+
self.val_replacement_map.insert(
161+
instr_name.clone() + ":LIMITI",
162+
self.format(source_limiti.value),
163+
);
164+
} else {
165+
self.val_replacement_map
166+
.insert(instr_name.clone() + ":LIMITI", String::from("nil"));
167+
}
163168

164169
self.val_replacement_map.insert(
165170
instr_name.clone() + ":BIAS",
@@ -283,16 +288,19 @@ impl SweepModel {
283288
.insert(instr_name.clone() + ":LIMITV", String::from("nil"));
284289
}
285290

286-
self.val_replacement_map.insert(
287-
instr_name.clone() + ":LIMITI",
288-
self.format(
289-
step_channel
290-
.start_stop_channel
291-
.common_chan_attributes
292-
.source_limiti
293-
.value,
294-
),
295-
);
291+
if let Some(source_limiti) = &step_channel
292+
.start_stop_channel
293+
.common_chan_attributes
294+
.source_limiti
295+
{
296+
self.val_replacement_map.insert(
297+
instr_name.clone() + ":LIMITI",
298+
self.format(source_limiti.value),
299+
);
300+
} else {
301+
self.val_replacement_map
302+
.insert(instr_name.clone() + ":LIMITI", String::from("nil"));
303+
}
296304

297305
self.val_replacement_map.insert(
298306
instr_name.clone() + ":START",
@@ -479,16 +487,19 @@ impl SweepModel {
479487
.insert(instr_name.clone() + ":LIMITV", String::from("nil"));
480488
}
481489

482-
self.val_replacement_map.insert(
483-
instr_name.clone() + ":LIMITI",
484-
self.format(
485-
sweep_channel
486-
.start_stop_channel
487-
.common_chan_attributes
488-
.source_limiti
489-
.value,
490-
),
491-
);
490+
if let Some(source_limiti) = &sweep_channel
491+
.start_stop_channel
492+
.common_chan_attributes
493+
.source_limiti
494+
{
495+
self.val_replacement_map.insert(
496+
instr_name.clone() + ":LIMITI",
497+
self.format(source_limiti.value),
498+
);
499+
} else {
500+
self.val_replacement_map
501+
.insert(instr_name.clone() + ":LIMITI", String::from("nil"));
502+
}
492503

493504
self.val_replacement_map.insert(
494505
instr_name.clone() + ":START",

0 commit comments

Comments
 (0)