134 lines
3.2 KiB
Python
134 lines
3.2 KiB
Python
from typing import Dict, Any
|
|
|
|
from devlib.util import print_instruction, DeviceInstruction
|
|
|
|
CHANNEL_STI_0 = 0
|
|
CHANNEL_STI_1 = 1
|
|
|
|
STI_WAVEFORM_POS = 0x00
|
|
STI_WAVEFORM_NEG = 0x01
|
|
STI_WAVEFORM_P2N = 0x02
|
|
STI_WAVEFORM_N2P = 0x03
|
|
|
|
STI_PRECISION_10 = 0
|
|
STI_PRECISION_01 = 1
|
|
|
|
STI_NUM_INFINITE = 1000
|
|
|
|
STI_INSTRUCTION = {
|
|
'GLOBAL': '3b001#header#;1b0;12bCURRENT',
|
|
'LOCAL': '3b010#header;1b0;4b>CHANNEL;3b>STI_MODE;1b>PRECISION;12b>STI_FREQ;10b>STI_PW;10b>STI_PW_IPI;10b>STI_NUM'
|
|
}
|
|
|
|
DEFAULT_PARAMETER = {
|
|
'CURRENT': 10, # uA
|
|
'CHANNEL': CHANNEL_STI_0,
|
|
'STI_MODE': STI_WAVEFORM_POS,
|
|
'PRECISION': STI_PRECISION_10,
|
|
'STI_FREQ': 1000, # Hz
|
|
'STI_PW': 100, # us
|
|
'STI_PW_IPI': 50, # us
|
|
'STI_NUM': STI_NUM_INFINITE,
|
|
}
|
|
|
|
|
|
def validate_frequency_parameter(parameter: Dict[str, Any]) -> bool:
|
|
p = int(parameter['PRECISION'])
|
|
f = int(parameter['STI_FREQ'])
|
|
w = int(parameter['STI_PW'])
|
|
i = int(parameter['STI_PW_IPI'])
|
|
return 1e6 * (1 if p == 0 else 10) / f >= 2 * w + i
|
|
|
|
|
|
SPIN_TIMEOUT = [
|
|
(10, 53),
|
|
(20, 106),
|
|
(30, 160),
|
|
(40, 214),
|
|
(50, 265),
|
|
(60, 319),
|
|
(70, 374),
|
|
(80, 427),
|
|
(100, 533),
|
|
(150, 800),
|
|
(200, 1066),
|
|
(300, 1600),
|
|
(400, 2133),
|
|
(500, 2666),
|
|
(1000, 5332),
|
|
]
|
|
|
|
|
|
def get_spin_timeout_value(timeout_us: int) -> int:
|
|
if timeout_us == 0:
|
|
return 0
|
|
|
|
elif timeout_us <= SPIN_TIMEOUT[0][0]:
|
|
return SPIN_TIMEOUT[0][1]
|
|
|
|
elif timeout_us >= SPIN_TIMEOUT[-1][0]:
|
|
return SPIN_TIMEOUT[-1][1]
|
|
|
|
else:
|
|
for i in range(len(SPIN_TIMEOUT)):
|
|
t0 = SPIN_TIMEOUT[i][0]
|
|
v0 = SPIN_TIMEOUT[i][1]
|
|
|
|
if timeout_us == t0:
|
|
return v0
|
|
|
|
t1 = SPIN_TIMEOUT[i + 1][0]
|
|
v1 = SPIN_TIMEOUT[i + 1][1]
|
|
|
|
if t0 < timeout_us < t1:
|
|
dt = t1 - t0
|
|
return int((t1 - timeout_us) * v0 / dt + (timeout_us - t0) * v1 / dt)
|
|
|
|
raise RuntimeError()
|
|
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------- #
|
|
|
|
|
|
STI_PARAMETER_0 = {
|
|
'CURRENT': 10, # uA
|
|
'CHANNEL': CHANNEL_STI_0,
|
|
'STI_MODE': STI_WAVEFORM_POS,
|
|
'PRECISION': STI_PRECISION_10,
|
|
'STI_FREQ': 10, # Hz
|
|
'STI_PW': 10, # us
|
|
'STI_PW_IPI': 10, # us
|
|
'STI_NUM': STI_NUM_INFINITE,
|
|
}
|
|
|
|
STI_PARAMETER_1 = {
|
|
'CURRENT': 10, # uA
|
|
'CHANNEL': CHANNEL_STI_1,
|
|
'STI_MODE': STI_WAVEFORM_NEG,
|
|
'PRECISION': STI_PRECISION_10,
|
|
'STI_FREQ': 10, # Hz
|
|
'STI_PW': 10, # us
|
|
'STI_PW_IPI': 10, # us
|
|
'STI_NUM': STI_NUM_INFINITE,
|
|
}
|
|
|
|
print_instruction(STI_INSTRUCTION['GLOBAL'], STI_PARAMETER_0, append_ris_type=False)
|
|
|
|
if not validate_frequency_parameter(STI_PARAMETER_0):
|
|
print('invalidate parameter')
|
|
else:
|
|
print('----')
|
|
print_instruction(STI_INSTRUCTION['LOCAL'], STI_PARAMETER_0, append_ris_type=False)
|
|
|
|
if not validate_frequency_parameter(STI_PARAMETER_1):
|
|
print('invalidate parameter')
|
|
else:
|
|
print('----')
|
|
print_instruction(STI_INSTRUCTION['LOCAL'], STI_PARAMETER_1, append_ris_type=False)
|
|
|
|
print('--sti--')
|
|
print_instruction(DeviceInstruction.VIS_STI, {})
|
|
|
|
print('--int--')
|
|
print_instruction(DeviceInstruction.VIS_INT, {})
|