diff --git a/src/py/calix/spiking/neuron.py b/src/py/calix/spiking/neuron.py
index 565ed12205400144c7a7f7cc9ad8fe87ef51eeda..947627485b328fd4da1d5536ea84606bf16f4ee8 100644
--- a/src/py/calix/spiking/neuron.py
+++ b/src/py/calix/spiking/neuron.py
@@ -6,7 +6,6 @@ import numbers
 from typing import Optional, Union, List
 from dataclasses import dataclass
 from warnings import warn
-from copy import deepcopy
 
 import numpy as np
 import quantities as pq
@@ -95,27 +94,6 @@ class NeuronCalibTarget(base.CalibrationTarget):
             0 * pq.ns, 4 * pq.us)
     }
 
-    @dataclass
-    class SyninParameters:
-        """
-        Collection of parameters for synaptic input calibration.
-
-        Contains boolean decisions that are set automatically based on
-        the shape of given targets:
-
-        :ivar i_synin_gm: Target bias currents for synaptic input OTAs,
-            with shapes modified to match the needs of the calibration
-            routines.
-        :ivar calibrate_synin: Decide whether synaptic input OTA
-            strengths are calibrated.
-        :ivar equalize_synin: Decide whether excitatory and inhibitory
-          synaptic input strengths are equalized.
-        """
-
-        i_synin_gm: np.ndarray
-        calibrate_synin: bool
-        equalize_synin: bool
-
     def check_types(self):
         """
         Check whether parameters have the right types and shapes.
@@ -175,36 +153,6 @@ class NeuronCalibTarget(base.CalibrationTarget):
                 "Target synaptic time constant is out of allowed range "
                 + "in the respective fit function.")
 
-    def prepare_synin(self) -> SyninParameters:
-        """
-        Does preparations for synaptic input calibration.
-
-        :return: SyninParameters class, containing desicions and
-            targets for synaptic input calibration.
-        """
-
-        i_synin_gm = deepcopy(self.i_synin_gm)
-
-        if not isinstance(i_synin_gm, np.ndarray) \
-                and np.ndim(i_synin_gm) > 0:
-            i_synin_gm = np.array(i_synin_gm)
-        if np.ndim(i_synin_gm) > 0 \
-                and i_synin_gm.shape[-1] == halco.NeuronConfigOnDLS.size:
-            calibrate_synin = False
-        else:
-            calibrate_synin = True
-        if np.ndim(i_synin_gm) > 0 \
-                and i_synin_gm.shape[0] \
-                == halco.SynapticInputOnNeuron.size:
-            equalize_synin = False
-        else:
-            equalize_synin = True
-            i_synin_gm = np.array(
-                [i_synin_gm] * halco.SynapticInputOnNeuron.size)
-
-        return self.SyninParameters(
-            i_synin_gm, calibrate_synin, equalize_synin)
-
 
 NeuronCalibTarget.DenseDefault = NeuronCalibTarget(
     leak=np.ones(
@@ -523,7 +471,6 @@ def calibrate(
 
     # process target
     target.check()
-    synin_parameters = target.prepare_synin()
 
     # create result object
     calib_result = _CalibrationResultInternal()
@@ -560,12 +507,8 @@ def calibrate(
         connection, options, calib_result)
 
     # calibrate or configure CUBA synaptic input OTA biases
-    if synin_parameters.calibrate_synin:
-        neuron_calib_parts.calibrate_synaptic_input(
-            connection, synin_parameters, calib_result, target_cadc_reads)
-    else:
-        calib_result.i_syn_exc_gm = synin_parameters.i_synin_gm[0]
-        calib_result.i_syn_inh_gm = synin_parameters.i_synin_gm[1]
+    neuron_calib_parts.calibrate_synaptic_input(
+        connection, target, calib_result, target_cadc_reads)
 
     # calibrate syn. input references at final biases
     neuron_calib_parts.calibrate_synin_references(
diff --git a/src/py/calix/spiking/neuron_calib_parts.py b/src/py/calix/spiking/neuron_calib_parts.py
index 612d462df8f4ad98293eb25c7c04eb8797b6b13c..7d2855e9aa9ab3be628a100d6ca35230f8182061 100644
--- a/src/py/calix/spiking/neuron_calib_parts.py
+++ b/src/py/calix/spiking/neuron_calib_parts.py
@@ -25,6 +25,47 @@ if TYPE_CHECKING:
     from calix.spiking import neuron
 
 
+class SyninParameters:
+    """
+    Collection of parameters for synaptic input calibration.
+
+    Contains decisions that are set automatically based on
+    the shape of targets for the calibration:
+
+    :ivar i_synin_gm: Target bias currents for synaptic input OTAs,
+        with shapes modified to match the needs of the calibration
+        routines.
+    :ivar calibrate_synin: Decide whether synaptic input OTA
+        strengths are calibrated.
+    :ivar equalize_synin: Decide whether excitatory and inhibitory
+      synaptic input strengths are equalized.
+    """
+
+    def __init__(self, target: neuron.NeuronCalibTarget):
+        """
+        :param target: Target parameters for neuron calib.
+        """
+
+        self.i_synin_gm = deepcopy(target.i_synin_gm)
+
+        if not isinstance(self.i_synin_gm, np.ndarray) \
+                and np.ndim(self.i_synin_gm) > 0:
+            self.i_synin_gm = np.array(self.i_synin_gm)
+        if np.ndim(self.i_synin_gm) > 0 \
+                and self.i_synin_gm.shape[-1] == halco.NeuronConfigOnDLS.size:
+            self.calibrate_synin = False
+        else:
+            self.calibrate_synin = True
+        if np.ndim(self.i_synin_gm) > 0 \
+                and self.i_synin_gm.shape[0] \
+                == halco.SynapticInputOnNeuron.size:
+            self.equalize_synin = False
+        else:
+            self.equalize_synin = True
+            self.i_synin_gm = np.array(
+                [self.i_synin_gm] * halco.SynapticInputOnNeuron.size)
+
+
 def calibrate_tau_syn(
         connection: hxcomm.ConnectionHandle,
         tau_syn: np.ndarray,
@@ -228,19 +269,27 @@ def finalize_synin_calib(
 
 def calibrate_synaptic_input(
         connection: hxcomm.ConnectionHandle,
-        synin_parameters: neuron.NeuronCalibTarget.SyninParameters,
+        target: neuron.NeuronCalibTarget,
         calib_result: neuron._CalibrationResultInternal,
         target_cadc_reads: np.ndarray):
     """
     Run calibration of (current-based) synaptic inputs.
 
     :param connection: Connection to chip to run on.
-    :param synin_parameters: Parameters for synaptic input calibration.
+    :param target: Target parameters for neuron calibration.
     :param calib_result: Calibration result to store parameters in.
     :param target_cadc_reads: CADC samples at resting potential, with
         synaptic input disabled.
     """
 
+    synin_parameters = SyninParameters(target)
+
+    # return early if synaptic inputs are not to be calibrated
+    if not synin_parameters.calibrate_synin:
+        calib_result.i_syn_exc_gm = synin_parameters.i_synin_gm[0]
+        calib_result.i_syn_inh_gm = synin_parameters.i_synin_gm[1]
+        return
+
     # Enable and calibrate excitatory synaptic input amplitudes to median
     neuron_helpers.reconfigure_synaptic_input(
         connection, excitatory_biases=synin_parameters.i_synin_gm[0])