diff --git a/src/qibolab/pulses.py b/src/qibolab/pulses.py
index 90c6c1d6..100bf498 100644
--- a/src/qibolab/pulses.py
+++ b/src/qibolab/pulses.py
@@ -733,7 +733,7 @@ class Pulse:
             value (se_int | int | np.integer): the time in ns.
         """
 
-        if not isinstance(value, (se_int, int, np.integer)):
+        if not isinstance(value, (se_int, int, np.integer, float)):
             raise TypeError(f"start argument type should be intSymbolicExpression or int, got {type(value).__name__}")
         if not value >= 0:
             raise ValueError(f"start argument must be >= 0, got {value}")
@@ -749,7 +749,7 @@ class Pulse:
         else:
             if isinstance(value, np.integer):
                 self._start = int(value)
-            elif isinstance(value, int):
+            else:
                 self._start = value
 
         if not self._duration is None:
@@ -794,7 +794,7 @@ class Pulse:
         else:
             if isinstance(value, np.integer):
                 self._duration = int(value)
-            elif isinstance(value, int):
+            else:
                 self._duration = value
 
         if not self._start is None:

diff --git a/tests/test_pulses.py b/tests/test_pulses.py
index 9c0edb98..b4970f39 100644
--- a/tests/test_pulses.py
+++ b/tests/test_pulses.py
@@ -158,6 +158,23 @@ def test_pulses_pulse_init():
     p11 = FluxPulse(0, 40, 0.9, SNZ(t_half_flux_pulse=17, b_amplitude=0.8), 0, 200)
     p11 = Pulse(0, 40, 0.9, 400e6, 0, eCap(alpha=2), 0, PulseType.DRIVE)
 
+    # initialisation with float duration and start
+    p12 = Pulse(
+        start=5.5,
+        duration=34.33,
+        amplitude=0.9,
+        frequency=20_000_000,
+        relative_phase=1,
+        shape=Rectangular(),
+        channel=0,
+        type=PulseType.READOUT,
+        qubit=0,
+    )
+    assert repr(p12) == "Pulse(5.5, 34.33, 0.9, 20_000_000, 1, Rectangular(), 0, PulseType.READOUT, 0)"
+    assert isinstance(p12.start, float)
+    assert isinstance(p12.duration, float)
+    assert p12.finish == 5.5 + 34.33
+
 
 def test_pulses_pulse_attributes():
     channel = 0
@@ -1152,9 +1169,9 @@ def test_pulse_properties(start, duration):
     check_properties(p0)
 
 
-@pytest.mark.parametrize("faulty_start", [10.0, "hello"])
-@pytest.mark.parametrize("faulty_duration", [100.0, "hello"])
-def test_pulse_setter_errors(faulty_start, faulty_duration):
+def test_pulse_setter_errors():
+    faulty_duration = "hello"
+    faulty_start = "hello"
     with pytest.raises(TypeError):
         p0 = Pulse(faulty_start, 100, 0.9, 0, 0, Rectangular(), 0)
     with pytest.raises(TypeError):

Pulse duration validation
Currently the pulse duration and start parameters are in integers of nanoseconds. However, this is an issue for instruments with sampling rates that are not 1GSps.

For the IcarusQ RFSoC, we are using a [bisection](https://github.com/qiboteam/qibolab/blob/icarusq_multiqubit/src/qibolab/instruments/icarusqfpga.py#L263-L268) to retrieve the sample indices associated with the pulse.

Perhaps this parameter can be sanitized on the driver side instead?
tests/test_pulses.py::test_pulses_pulse_init
tests/test_pulses.py::test_pulses_pulse_attributes tests/test_pulses.py::test_pulses_is_equal_ignoring_start tests/test_pulses.py::test_pulses_pulse_serial tests/test_pulses.py::test_pulses_pulseshape_sampling_rate tests/test_pulses.py::test_raise_shapeiniterror tests/test_pulses.py::test_pulses_pulseshape_drag_shape tests/test_pulses.py::test_pulses_pulse_hash tests/test_pulses.py::test_pulses_pulse_aliases tests/test_pulses.py::test_pulses_pulse_split_pulse tests/test_pulses.py::test_pulses_pulsesequence_init tests/test_pulses.py::test_pulses_pulsesequence_operators tests/test_pulses.py::test_pulses_pulsesequence_add tests/test_pulses.py::test_pulses_pulsesequence_clear tests/test_pulses.py::test_pulses_pulsesequence_start_finish tests/test_pulses.py::test_pulses_pulsesequence_get_channel_pulses tests/test_pulses.py::test_pulses_pulsesequence_get_qubit_pulses tests/test_pulses.py::test_pulses_pulsesequence_pulses_overlap tests/test_pulses.py::test_pulses_pulsesequence_separate_overlapping_pulses tests/test_pulses.py::test_pulses_pulse_symbolic_expressions tests/test_pulses.py::test_pulses_pulse_pulse_order tests/test_pulses.py::test_pulses_waveform tests/test_pulses.py::test_pulses_pulseshape_rectangular tests/test_pulses.py::test_pulses_pulseshape_gaussian tests/test_pulses.py::test_pulses_pulseshape_drag tests/test_pulses.py::test_pulses_pulseshape_eq tests/test_pulses.py::test_pulse tests/test_pulses.py::test_readout_pulse tests/test_pulses.py::test_pulse_sequence_add tests/test_pulses.py::test_pulse_sequence__add__ tests/test_pulses.py::test_pulse_sequence__mul__ tests/test_pulses.py::test_pulse_sequence_add_readout tests/test_pulses.py::test_envelope_waveform_i_q tests/test_pulses.py::test_pulse_properties[100-0] tests/test_pulses.py::test_pulse_properties[100-10] tests/test_pulses.py::test_pulse_properties[100-start2] tests/test_pulses.py::test_pulse_properties[100-start3] tests/test_pulses.py::test_pulse_properties[500-0] tests/test_pulses.py::test_pulse_properties[500-10] tests/test_pulses.py::test_pulse_properties[500-start2] tests/test_pulses.py::test_pulse_properties[500-start3] tests/test_pulses.py::test_pulse_properties[duration2-0] tests/test_pulses.py::test_pulse_properties[duration2-10] tests/test_pulses.py::test_pulse_properties[duration2-start2] tests/test_pulses.py::test_pulse_properties[duration2-start3] tests/test_pulses.py::test_pulse_properties[duration3-0] tests/test_pulses.py::test_pulse_properties[duration3-10] tests/test_pulses.py::test_pulse_properties[duration3-start2] tests/test_pulses.py::test_pulse_properties[duration3-start3] tests/test_pulses.py::test_pulse_setter_errors