Как вы используете поведенческий резистор в pySpice?

Я пытаюсь смоделировать очень простую схему с поведенческими резисторами, которые меняют состояние на основе глобального параметра. На самом деле я просто новичок в *spice и играю с «резисторами как переключателями».

Рабочая схема в ngspice:

      .param pos = 1

vin 1 0 dc 10
r1 1 2 r='{pos} == 1 ? 1u : 1G'
r2 2 0 1
r3 1 3 r='{pos} == 2 ? 1u : 1G'
r4 3 0 1

Что при запуске (и «pos» изменено) делает именно то, что я ожидаю:

      Circuit: resistor switch circuit

Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

No. of Data Rows : 1
v(2) = 9.999990e+00
v(3) = 1.000000e-08
Reset re-loads circuit resistor switch circuit

Circuit: resistor switch circuit

Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

No. of Data Rows : 1
v(2) = 1.000000e-08
v(3) = 9.999990e+00

Я хотел бы воссоздать эту схему в pyspice, которая выглядит так:

      circuit = Circuit('resistor switch circuit')
circuit._parameters['pos'] = 1
circuit.V('input', 'in', circuit.gnd, 10@u_V)
circuit.R(1, 'in', 'pos1', raw_spice='r=\'{pos} == 1 ? 1u : 1G\'')
circuit.R(2, 'pos1', circuit.gnd, 1@u_Ohm)
circuit.R(3, 'in', 'pos2', raw_spice='r=\'{pos} == 2 ? 1u : 1G\'')
circuit.R(4, 'pos2', circuit.gnd, 1@u_Ohm)

print(circuit)

И генерирует список соединений, который, насколько я могу судить, (фактически) такой же, как список соединений ngspice выше:

      .title resistor switch circuit
.param pos=1

Vinput in 0 10V
R1 in pos1 r='{pos} == 1 ? 1u : 1G'
R2 pos1 0 1
R3 in pos2 r='{pos} == 2 ? 1u : 1G'
R4 pos2 0 1

Однако его запуск приводит к следующему:

      2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 4, new internal line no.: 5:
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Syntax error: letter [{]
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 4, new internal line no.: 5:
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Expression err: {pos}==1?1u:1g}
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 4, new internal line no.: 5:
2023-01-10 17:01:07,739 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Cannot compute substitute
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 6, new internal line no.: 7:
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Syntax error: letter [{]
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 6, new internal line no.: 7:
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Expression err: {pos}==2?1u:1g}
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Original line no.: 6, new internal line no.: 7:
2023-01-10 17:01:07,740 - PySpice.Spice.NgSpice.Shared.NgSpiceShared - Shared.ERROR - Cannot compute substitute

Я считаю, что pyspice поддерживает поведенческие резисторы:https://pyspice.fabrice-salvaire.fr/releases/v1.3/api/PySpice/Spice/BasicElement.html#PySpice.Spice.BasicElement.BehavioralResistor

Но независимо от того, как я пытаюсь дать выражение:

      circuit.R(1, 'in', 'pos1', '{pos} == 1 ? 1u : 1G')
circuit.R(1, 'in', 'pos1', R='{pos} == 1 ? 1u : 1G')

и т. д. Я всегда получаю какую-то ошибку при попытке запустить симуляцию. Кажется, что только "raw_spice=" действительно дает совместимый список соединений, но затем терпит неудачу при моделировании.

Как вы на самом деле используете поведенческий резистор в pyspice?

1 ответ

Согласно комментарию Джошуа, включение {} вокруг имени переменной/параметра (как с {pos} в моих примерах), кажется, не требуется для правильного синтаксического анализа.

Как ни странно, ngspice напрямую принимает этот формат. Будучи новичком в использовании списков соединений, я видел, что этот формат довольно часто используется в примере кода, и, поскольку он работал, предположил, что это необходимо для обозначения vars/params - это не так.

Удаление постороннего '{}' из создания компонента (хотя я все еще передаю уравнение через raw_spice) решает проблему и позволяет запустить симуляцию. Отвечаю здесь для дальнейшего использования.

Другие вопросы по тегам