You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.6 KiB
94 lines
2.6 KiB
"""
|
|
Simple RC Circuit Example
|
|
|
|
This example demonstrates using the pyngspice Python extension
|
|
to simulate a basic RC low-pass filter.
|
|
"""
|
|
|
|
# Note: This example requires the ngspice extension to be built and installed
|
|
# Run: pip install -e . from the ngspice root directory
|
|
|
|
try:
|
|
from pyngspice import SimRunner, RawRead
|
|
except ImportError:
|
|
print("pyngspice extension not installed. Run: pip install -e .")
|
|
print("This example shows the intended API usage.")
|
|
exit(1)
|
|
|
|
import numpy as np
|
|
import os
|
|
|
|
# Create a simple RC netlist
|
|
netlist_content = """
|
|
* Simple RC Low-Pass Filter
|
|
* Cutoff frequency: ~1.59 kHz
|
|
|
|
V1 in 0 AC 1 SIN(0 1 1k)
|
|
R1 in out 1k
|
|
C1 out 0 100n
|
|
|
|
.tran 10u 10m
|
|
.end
|
|
"""
|
|
|
|
def main():
|
|
# Create output directory
|
|
output_dir = "./output"
|
|
os.makedirs(output_dir, exist_ok=True)
|
|
|
|
# Write netlist to file
|
|
netlist_file = os.path.join(output_dir, "simple_rc.net")
|
|
with open(netlist_file, "w") as f:
|
|
f.write(netlist_content)
|
|
|
|
print(f"Created netlist: {netlist_file}")
|
|
|
|
# Create SimRunner and run simulation
|
|
print("Running simulation...")
|
|
runner = SimRunner(output_folder=output_dir)
|
|
raw_file, log_file = runner.run_now(netlist_file)
|
|
|
|
print(f"Raw file: {raw_file}")
|
|
print(f"Log file: {log_file}")
|
|
|
|
# Read results
|
|
raw = RawRead(raw_file)
|
|
print(f"\nAnalysis type: {raw.analysis_type}")
|
|
print(f"Number of traces: {raw.num_variables}")
|
|
print(f"Number of points: {raw.num_points}")
|
|
print(f"\nAvailable traces:")
|
|
for name in raw.get_trace_names():
|
|
print(f" - {name}")
|
|
|
|
# Get time and voltage data
|
|
time = raw.get_trace("time").get_wave(0)
|
|
v_in = raw.get_trace("V(in)").get_wave(0)
|
|
v_out = raw.get_trace("V(out)").get_wave(0)
|
|
|
|
print(f"\nTime range: {time[0]*1e3:.3f} ms to {time[-1]*1e3:.3f} ms")
|
|
print(f"V(in) range: {min(v_in):.3f} V to {max(v_in):.3f} V")
|
|
print(f"V(out) range: {min(v_out):.3f} V to {max(v_out):.3f} V")
|
|
|
|
# Optional: Plot results if matplotlib is available
|
|
try:
|
|
import matplotlib.pyplot as plt
|
|
|
|
fig, ax = plt.subplots(figsize=(10, 6))
|
|
ax.plot(time * 1e3, v_in, label='V(in)', alpha=0.7)
|
|
ax.plot(time * 1e3, v_out, label='V(out)', linewidth=2)
|
|
ax.set_xlabel('Time (ms)')
|
|
ax.set_ylabel('Voltage (V)')
|
|
ax.set_title('RC Low-Pass Filter Response')
|
|
ax.legend()
|
|
ax.grid(True, alpha=0.3)
|
|
|
|
plot_file = os.path.join(output_dir, "simple_rc.png")
|
|
plt.savefig(plot_file, dpi=150)
|
|
print(f"\nPlot saved to: {plot_file}")
|
|
plt.show()
|
|
|
|
except ImportError:
|
|
print("\nNote: Install matplotlib to generate plots")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|