Skip to content

Power Measurement

The SpiNNaker2 STM interface provides comprehensive power measurement capabilities through the PowerMeasurement and PowerResults classes.

Basic Usage

To measure power while running an application on SpiNNaker2:

from spinnaker2_stm.read_power import PowerMeasurement, PowerResults

data_file = "power_record.log"
power_meter = PowerMeasurement(
    data_file, 
    rdout_delay=100,
    ser_path="/dev/ttyS2_192_168_2_33", 
    get_all=True
)

with power_meter:
    # run experiment or testcase on SpiNNaker2 chip

Analyzing Results

The measurement data can be analyzed in two ways:

  1. From the same script:

    power_results = power_meter.get_results()
    

  2. Or in a new script:

    power_results = PowerResults(data_file)
    

Available Measurements

The PowerResults class provides access to:

  • Raw shunt voltages (μV): power_results.raw_data
  • Shunt currents (mA): power_results.shunt_current
  • Power consumption (mW): power_results.shunt_power

Each measurement includes data for different power domains:

  • PL05: 0.5V power lane
  • PL08: 0.8V power lane
  • PLL: PLL power (0.8V)
  • IO: I/O power (1.8V)
  • Q: Q power (1.1V)

Plotting

Plot power consumption over time:

import matplotlib.pyplot as plt

# Plot shunt power over time
power_results.shunt_power.plot(xlabel="time [s]", ylabel="power [mW]")
plt.show()

Energy Calculation

Calculate total energy consumption:

total_energy = power_results.total_energy()
print(f"Total energy: {total_energy:.3f} J")

Advanced Configuration

PowerMeasurement Parameters

The PowerMeasurement class accepts the following parameters:

PowerMeasurement(
    file_path: str,          # Path where measurement data will be saved
    rdout_delay: int,        # Delay between measurements in milliseconds
    ser_path: str = '/dev/ttyACM0',  # Path to serial interface
    get_all: bool = False    # Whether to measure all power rails
)

Shunt Resistor Values

The following shunt resistor values are used for measurements:

R_PL08_SHUNT     = 0.008  # Ohm (R570)
R_PL05_SHUNT     = 0.03   # Ohm (R569)
R_VDDPLL08_SHUNT = 0.05   # Ohm (R131)
R_VDDIO18_SHUNT  = 0.05   # Ohm (R572)
R_VDDQ11_SHUNT   = 0.05   # Ohm (R571)

Command Line Interface

The package also provides a command-line interface for power measurements:

python -m spinnaker2_stm.measure_base [OPTIONS]

Options:
  --plotv         Plot shunt voltage [uV] over time [s]
  --ploti         Plot shunt current over time [s]
  --plotp         Plot shunt power over time [s]
  --csv           Write out data file as CSV
  --get_all       Write out all shunt voltages (default: only 0V5 & 0V8)
  --num_dpoints   Number of data points (default: 100)
  --rdout_delay   Delay between data points [ms] (default: 100)
  --runtime       Measurement runtime [ms]
  --freq_pe       PE frequency (default: 150)
  --freq_noc      NoC frequency (default: 150)
  --ser_path      Path to serial STM interface (default: /dev/ttyACM0)

Example: Complete Measurement Script

Here's a complete example showing how to perform power measurements and analyze the results:

from spinnaker2_stm.read_power import PowerMeasurement, PowerResults
import matplotlib.pyplot as plt

# Configure measurement
data_file = "power_record.log"
power_meter = PowerMeasurement(
    data_file,
    rdout_delay=100,  # 100ms between measurements
    get_all=True      # measure all power rails
)

# Perform measurement
with power_meter:
    # Your SpiNNaker2 code here
    pass

# Analyze results
power_results = power_meter.get_results()

# plot shunt power over time
power_results.shunt_power.plot(xlabel="time [s]", ylabel="power [mW]")
plt.show()

# print total energy
print(f"total energy: {power_results.total_energy():.3f} J")