LOLA
neuron.h
Go to the documentation of this file.
1 #pragma once
2 #include "haldls/vx/v3/capmem.h"
3 #include "haldls/vx/v3/neuron.h"
4 #include "hate/visibility.h"
5 #include "lola/vx/genpybind.h"
6 #include "lola/vx/v3/synapse.h"
7 
9 
13 class GENPYBIND(visible) AtomicNeuron
14 {
15 public:
16  typedef haldls::vx::v3::CapMemCell::Value AnalogValue GENPYBIND(visible);
17  typedef haldls::vx::v3::CapMemCell::DisableRefresh AnalogDisableRefresh GENPYBIND(visible);
18  typedef haldls::vx::v3::CapMemCell::value_type AnalogValueVariant;
19 
20  struct GENPYBIND(visible) SynapticInput
21  {
22  SynapticInput() SYMBOL_VISIBLE;
23 
27  bool enable;
28 
31  AnalogValueVariant i_bias_tau;
32 
38  AnalogValueVariant i_bias_coba;
39 
44  AnalogValueVariant i_shift_reference;
45 
47  AnalogValueVariant i_bias_gm;
48 
50  AnalogValueVariant v_rev_coba;
51 
55  bool enable_small_capacitance;
56 
58  bool enable_high_resistance;
59 
61  bool enable_coba_mode;
62 
63  bool operator==(SynapticInput const& other) const SYMBOL_VISIBLE;
64  bool operator!=(SynapticInput const& other) const SYMBOL_VISIBLE;
65 
66  GENPYBIND(stringstream)
67  friend std::ostream& operator<<(std::ostream& os, SynapticInput const& config)
68  SYMBOL_VISIBLE;
69  };
70 
71  struct GENPYBIND(visible) Leak
72  {
73  Leak() SYMBOL_VISIBLE;
74 
77 
78  /*
79  * Bias current of OTA during leak.
80  * High values result in a shorter membrane time constant.
81  */
83 
85  bool enable_degeneration;
86 
88  bool enable_division;
89 
91  bool enable_multiplication;
92 
93  bool operator==(Leak const& other) const SYMBOL_VISIBLE;
94  bool operator!=(Leak const& other) const SYMBOL_VISIBLE;
95 
96  GENPYBIND(stringstream)
97  friend std::ostream& operator<<(std::ostream& os, Leak const& config) SYMBOL_VISIBLE;
98  };
99 
100  struct GENPYBIND(visible) Reset
101  {
102  Reset() SYMBOL_VISIBLE;
103 
106 
107  /*
108  * Bias current of OTA during reset.
109  * High values result in higher reset conductance.
110  */
112 
114  bool enable_degeneration;
115 
117  bool enable_division;
118 
120  bool enable_multiplication;
121 
122  bool operator==(Reset const& other) const SYMBOL_VISIBLE;
123  bool operator!=(Reset const& other) const SYMBOL_VISIBLE;
124 
125  GENPYBIND(stringstream)
126  friend std::ostream& operator<<(std::ostream& os, Reset const& config) SYMBOL_VISIBLE;
127  };
128 
129  struct GENPYBIND(visible) Threshold
130  {
131  Threshold() SYMBOL_VISIBLE;
132 
134  bool enable;
135 
137  AnalogValueVariant v_threshold;
138 
139  bool operator==(Threshold const& other) const SYMBOL_VISIBLE;
140  bool operator!=(Threshold const& other) const SYMBOL_VISIBLE;
141 
142  GENPYBIND(stringstream)
143  friend std::ostream& operator<<(std::ostream& os, Threshold const& config) SYMBOL_VISIBLE;
144  };
145 
150  struct GENPYBIND(visible) Multicompartment
151  {
152  Multicompartment() SYMBOL_VISIBLE;
153 
155  bool connect_soma;
156 
158  bool connect_soma_right;
159 
161  bool connect_right;
162 
164  bool connect_vertical;
165 
167  bool enable_conductance;
168 
170  bool enable_conductance_division;
171 
173  bool enable_conductance_multiplication;
174 
176  AnalogValueVariant i_bias_nmda;
177 
178  bool operator==(Multicompartment const& other) const SYMBOL_VISIBLE;
179  bool operator!=(Multicompartment const& other) const SYMBOL_VISIBLE;
180 
181  GENPYBIND(stringstream)
182  friend std::ostream& operator<<(std::ostream& os, Multicompartment const& config)
183  SYMBOL_VISIBLE;
184  };
185 
186  struct GENPYBIND(visible) ConstantCurrent
187  {
188  ConstantCurrent() SYMBOL_VISIBLE;
189 
191  bool enable;
192 
195 
197  enum class Type
198  {
199  source,
200  sink
201  } type;
202 
203  bool operator==(ConstantCurrent const& other) const SYMBOL_VISIBLE;
204  bool operator!=(ConstantCurrent const& other) const SYMBOL_VISIBLE;
205 
206  GENPYBIND(stringstream)
207  friend std::ostream& operator<<(std::ostream& os, ConstantCurrent const& config)
208  SYMBOL_VISIBLE;
209  };
210 
211  struct GENPYBIND(visible) MembraneCapacitance
212  {
213  typedef haldls::vx::v3::NeuronConfig::MembraneCapacitorSize CapacitorSize
214  GENPYBIND(visible);
215 
216  MembraneCapacitance() SYMBOL_VISIBLE;
217 
219  CapacitorSize capacitance;
220 
221  bool operator==(MembraneCapacitance const& other) const SYMBOL_VISIBLE;
222  bool operator!=(MembraneCapacitance const& other) const SYMBOL_VISIBLE;
223 
224  GENPYBIND(stringstream)
225  friend std::ostream& operator<<(std::ostream& os, MembraneCapacitance const& config)
226  SYMBOL_VISIBLE;
227  };
228 
229  struct GENPYBIND(visible) Adaptation
230  {
231  Adaptation() SYMBOL_VISIBLE;
232 
234  bool enable;
235 
240  bool enable_pulse;
241 
243  bool invert_a;
244 
246  bool invert_b;
247 
250 
252  AnalogValueVariant i_bias_tau;
253 
256 
259 
262 
263  bool operator==(Adaptation const& other) const SYMBOL_VISIBLE;
264  bool operator!=(Adaptation const& other) const SYMBOL_VISIBLE;
265 
266  GENPYBIND(stringstream)
267  friend std::ostream& operator<<(std::ostream& os, Adaptation const& config) SYMBOL_VISIBLE;
268  };
269 
270  struct GENPYBIND(visible) Exponential
271  {
273  bool enable;
274 
277 
280 
281  Exponential() SYMBOL_VISIBLE;
282 
283  bool operator==(Exponential const& other) const SYMBOL_VISIBLE;
284  bool operator!=(Exponential const& other) const SYMBOL_VISIBLE;
285 
286  GENPYBIND(stringstream)
287  friend std::ostream& operator<<(std::ostream& os, Exponential const& config) SYMBOL_VISIBLE;
288  };
289 
290  struct GENPYBIND(visible) EventRouting
291  {
292  EventRouting() SYMBOL_VISIBLE;
293 
294  typedef haldls::vx::v3::NeuronBackendConfig::AddressOut Address GENPYBIND(visible);
295 
302  enum class AnalogOutputMode
303  {
304  off,
305  normal,
306  strong
307  } analog_output;
308 
311 
314 
317 
320 
326 
328  AnalogOutputMode analog_output,
329  bool enable_digital,
330  bool enable_bypass_excitatory,
331  bool enable_bypass_inhibitory,
332  Address address,
333  bool enable_post_overwrite) SYMBOL_VISIBLE;
334 
335  static const EventRouting disabled SYMBOL_VISIBLE;
336  static const EventRouting enabled SYMBOL_VISIBLE;
337  static const EventRouting bypass_exc SYMBOL_VISIBLE;
338  static const EventRouting bypass_inh SYMBOL_VISIBLE;
339 
340  bool operator==(EventRouting const& other) const SYMBOL_VISIBLE;
341  bool operator!=(EventRouting const& other) const SYMBOL_VISIBLE;
342 
343  GENPYBIND(stringstream)
344  friend std::ostream& operator<<(std::ostream& os, EventRouting const& config)
345  SYMBOL_VISIBLE;
346  };
347 
348  struct GENPYBIND(visible) Readout
349  {
350  typedef haldls::vx::v3::NeuronConfig::ReadoutSource Source GENPYBIND(visible);
351 
358 
361 
367 
383  Source source;
384 
385  Readout() SYMBOL_VISIBLE;
386 
387  bool operator==(Readout const& other) const SYMBOL_VISIBLE;
388  bool operator!=(Readout const& other) const SYMBOL_VISIBLE;
389 
390  GENPYBIND(stringstream)
391  friend std::ostream& operator<<(std::ostream& os, Readout const& config) SYMBOL_VISIBLE;
392  };
393 
394  struct GENPYBIND(visible) RefractoryPeriod
395  {
396  typedef haldls::vx::v3::NeuronBackendConfig::InputClock InputClock GENPYBIND(visible);
397  typedef haldls::vx::v3::NeuronBackendConfig::ResetHoldoff ResetHoldoff GENPYBIND(visible);
398  typedef haldls::vx::v3::NeuronBackendConfig::RefractoryTime RefractoryTime
399  GENPYBIND(visible);
400 
406 
416 
423 
428 
429  RefractoryPeriod() SYMBOL_VISIBLE;
430 
431  bool operator==(RefractoryPeriod const& other) const SYMBOL_VISIBLE;
432  bool operator!=(RefractoryPeriod const& other) const SYMBOL_VISIBLE;
433 
434  GENPYBIND(stringstream)
435  friend std::ostream& operator<<(std::ostream& os, RefractoryPeriod const& config)
436  SYMBOL_VISIBLE;
437  };
438 
439  struct GENPYBIND(visible) Bayesian
440  {
441  Bayesian() SYMBOL_VISIBLE;
442 
443  bool enable;
444  bool connect_fire_vertical;
445  bool connect_fire_to_right;
446  bool connect_fire_from_right;
447 
453  bool enable_master;
454  bool enable_slave;
455  bool enable_0;
456  bool enable_1;
457 
458  bool operator==(Bayesian const& other) const SYMBOL_VISIBLE;
459  bool operator!=(Bayesian const& other) const SYMBOL_VISIBLE;
460 
461  GENPYBIND(stringstream)
462  friend std::ostream& operator<<(std::ostream& os, Bayesian const& config) SYMBOL_VISIBLE;
463  };
464 
465 
466  typedef halco::hicann_dls::vx::v3::AtomicNeuronOnDLS coordinate_type;
467  typedef std::false_type has_local_data;
468 
469  AtomicNeuron() SYMBOL_VISIBLE;
470 
485 
487  explicit operator haldls::vx::v3::NeuronConfig() const SYMBOL_VISIBLE;
488  GENPYBIND_MANUAL({
489  parent.def("asNeuronConfig", [](GENPYBIND_PARENT_TYPE const& self) {
490  return static_cast<haldls::vx::v3::NeuronConfig>(self);
491  });
492  })
493 
494  void set_from(haldls::vx::v3::NeuronConfig const& neuron_config) SYMBOL_VISIBLE;
495 
497  explicit operator haldls::vx::v3::NeuronBackendConfig() const SYMBOL_VISIBLE;
498  GENPYBIND_MANUAL({
499  parent.def("asNeuronBackendConfig", [](GENPYBIND_PARENT_TYPE const& self) {
500  return static_cast<haldls::vx::v3::NeuronBackendConfig>(self);
501  });
502  })
503 
504  void set_from(haldls::vx::v3::NeuronBackendConfig const& neuron_backend_config) SYMBOL_VISIBLE;
505 
506  bool operator==(AtomicNeuron const& other) const SYMBOL_VISIBLE;
507  bool operator!=(AtomicNeuron const& other) const SYMBOL_VISIBLE;
508 
509  GENPYBIND(stringstream)
510  friend std::ostream& operator<<(std::ostream& os, AtomicNeuron const& config) SYMBOL_VISIBLE;
511 
512 private:
513  friend class haldls::vx::detail::VisitPreorderImpl<AtomicNeuron>;
514 };
515 
516 
520 class GENPYBIND(visible) NeuronBlock
521 {
522 public:
523  typedef haldls::vx::v3::CapMemCell::Value AnalogValue GENPYBIND(visible);
524  typedef haldls::vx::v3::CapMemCell::DisableRefresh AnalogDisableRefresh GENPYBIND(visible);
525  typedef haldls::vx::v3::CapMemCell::value_type AnalogValueVariant;
526 
527  typedef halco::hicann_dls::vx::v3::NeuronBlockOnDLS coordinate_type;
528  typedef std::false_type has_local_data;
529 
530  NeuronBlock() = default;
531 
532  typedef halco::common::
533  typed_heap_array<AtomicNeuron, halco::hicann_dls::vx::v3::AtomicNeuronOnDLS>
534  AtomicNeurons GENPYBIND(opaque(false));
538  AtomicNeurons atomic_neurons{};
539 
540  typedef halco::common::typed_array<
541  haldls::vx::v3::CommonNeuronBackendConfig,
542  halco::hicann_dls::vx::v3::CommonNeuronBackendConfigOnDLS>
543  Backends GENPYBIND(opaque(false));
544 
548  Backends backends{};
549 
550  typedef halco::common::typed_array<
552  halco::hicann_dls::vx::v3::ColumnCurrentRowOnDLS>
553  CurrentRows GENPYBIND(opaque(false));
554 
558  CurrentRows current_rows{};
559 
560  typedef halco::common::
561  typed_array<AnalogValueVariant, halco::hicann_dls::vx::v3::CapMemBlockOnDLS>
562  AnalogValues;
566  AnalogValues v_bias_casc_n{
567  AnalogValue{250}, AnalogValue{250}, AnalogValue{250}, AnalogValue{250}};
568 
572  AnalogValues i_bias_readout_amp{
573  AnalogValue{110}, AnalogValue{110}, AnalogValue{110}, AnalogValue{110}};
574 
578  AnalogValues i_bias_leak_source_follower{
579  AnalogValue{100}, AnalogValue{100}, AnalogValue{100}, AnalogValue{100}};
580 
584  AnalogValues i_bias_threshold_comparator{
585  AnalogValue{200}, AnalogValue{200}, AnalogValue{200}, AnalogValue{200}};
586 
591  AnalogValues i_bias_synin_drop{
592  AnalogValue{300}, AnalogValue{300}, AnalogValue{300}, AnalogValue{300}};
593 
594  bool operator==(NeuronBlock const& other) const SYMBOL_VISIBLE;
595  bool operator!=(NeuronBlock const& other) const SYMBOL_VISIBLE;
596 
597  GENPYBIND(stringstream)
598  friend std::ostream& operator<<(std::ostream& os, NeuronBlock const& config) SYMBOL_VISIBLE;
599 
600  // TODO (Issue 3622): Manual wrapping is necessary due to genpybind forgetting full
601  // qualification
602  GENPYBIND_MANUAL({
603  auto av = parent->py::template class_<::lola::vx::v3::NeuronBlock::AnalogValues>(
604  parent, "AnalogValues");
605  av.def(
606  "fill", &::lola::vx::v3::NeuronBlock::AnalogValues::fill, "", parent->py::arg("val"));
607  {
608  typedef ::lola::vx::v3::NeuronBlock::AnalogValues::reference (
609  ::lola::vx::v3::NeuronBlock::AnalogValues::*genpybind_at_type)(
610  const ::lola::vx::v3::NeuronBlock::AnalogValues::key_type&);
611  av.def(
612  "at", (genpybind_at_type) & ::lola::vx::v3::NeuronBlock::AnalogValues::at, "",
613  parent->py::arg("key"));
614  }
615  {
616  typedef ::lola::vx::v3::NeuronBlock::AnalogValues::const_reference (
617  ::lola::vx::v3::NeuronBlock::AnalogValues::*genpybind_at_type)(
618  const ::lola::vx::v3::NeuronBlock::AnalogValues::key_type&) const;
619  av.def(
620  "at", (genpybind_at_type) & ::lola::vx::v3::NeuronBlock::AnalogValues::at, "",
621  parent->py::arg("key"));
622  }
623  {
624  typedef ::lola::vx::v3::NeuronBlock::AnalogValues::reference (
625  ::lola::vx::v3::NeuronBlock::AnalogValues::*genpybind_front_type)();
626  av.def(
627  "front", (genpybind_front_type) & ::lola::vx::v3::NeuronBlock::AnalogValues::front,
628  "");
629  }
630  {
631  typedef ::lola::vx::v3::NeuronBlock::AnalogValues::const_reference (
632  ::lola::vx::v3::NeuronBlock::AnalogValues::*genpybind_front_type)() const;
633  av.def(
634  "front", (genpybind_front_type) & ::lola::vx::v3::NeuronBlock::AnalogValues::front,
635  "");
636  }
637  {
638  typedef ::lola::vx::v3::NeuronBlock::AnalogValues::reference (
639  ::lola::vx::v3::NeuronBlock::AnalogValues::*genpybind_back_type)();
640  av.def(
641  "back", (genpybind_back_type) & ::lola::vx::v3::NeuronBlock::AnalogValues::back,
642  "");
643  }
644  {
645  typedef ::lola::vx::v3::NeuronBlock::AnalogValues::const_reference (
646  ::lola::vx::v3::NeuronBlock::AnalogValues::*genpybind_back_type)() const;
647  av.def(
648  "back", (genpybind_back_type) & ::lola::vx::v3::NeuronBlock::AnalogValues::back,
649  "");
650  }
651  av.def(
652  "__getitem__", &::lola::vx::v3::NeuronBlock::AnalogValues::get, "",
653  parent->py::arg("key"), parent->py::return_value_policy::reference);
654  av.def(
655  "__setitem__", &::lola::vx::v3::NeuronBlock::AnalogValues::set, "",
656  parent->py::arg("key"), parent->py::arg("value"));
657  av.def(
658  "__iter__",
659  [av](::lola::vx::v3::NeuronBlock::AnalogValues& self) {
660  return pybind11::make_iterator(self);
661  },
662  parent->py::template keep_alive<0, 1>());
663 
664  av.def("to_numpy", [](::lola::vx::v3::NeuronBlock::AnalogValues const& self) {
665  return ::halco::common::detail::to_numpy(self);
666  });
667  av.def(
668  "from_numpy",
669  [](::lola::vx::v3::NeuronBlock::AnalogValues& self, pybind11::array const& array) {
670  ::halco::common::detail::from_numpy(self, array);
671  });
672  av.def(parent->py::template init<const ::lola::vx::v3::NeuronBlock::AnalogValues&>(), "");
673  av.def(parent->py::template init<>(), "");
674  av.def_property_readonly(
675  "size", parent->py::cpp_function(&::lola::vx::v3::NeuronBlock::AnalogValues::size));
676  av.def_property_readonly(
677  "max_size",
678  parent->py::cpp_function(&::lola::vx::v3::NeuronBlock::AnalogValues::max_size));
679  av.def_property_readonly(
680  "empty", parent->py::cpp_function(&::lola::vx::v3::NeuronBlock::AnalogValues::empty));
681  })
682 private:
683  friend class haldls::vx::detail::VisitPreorderImpl<NeuronBlock>;
684 };
685 
686 } // namespace lola::vx::v3
687 
688 #include "lola/vx/v3/neuron.tcc"
Configuration of digital and analog parameters for a single-denmem neuron.
Definition: neuron.h:14
haldls::vx::v3::CapMemCell::Value AnalogValue
Definition: neuron.h:16
haldls::vx::v3::CapMemCell::DisableRefresh AnalogDisableRefresh
Definition: neuron.h:17
haldls::vx::v3::CapMemCell::value_type AnalogValueVariant
Definition: neuron.h:18
std::false_type has_local_data
Definition: neuron.h:467
halco::hicann_dls::vx::v3::AtomicNeuronOnDLS coordinate_type
Definition: neuron.h:466
#define GENPYBIND_TAG_LOLA_VX_V3
Definition: genpybind.h:6
Definition: cadc.h:465
class lola::vx::v3::AtomicNeuron set_from(haldls::vx::v3::NeuronConfig const &neuron_config) SYMBOL_VISIBLE
lola::vx::ColumnCurrentRow ColumnCurrentRow
Definition: synapse.h:8
haldls::vx::v2::NeuronBackendConfig::AddressOut Address
Definition: neuron.h:270
Type
Sink/source offset current on membrane.
Definition: neuron.h:198
bool operator!=(ConstantCurrent const &other) const SYMBOL_VISIBLE
bool operator==(ConstantCurrent const &other) const SYMBOL_VISIBLE
bool enable_bypass_inhibitory
Enable inhibitory bypass circuit.
Definition: neuron.h:316
Address address
Lower 8 bit of address sent on event output.
Definition: neuron.h:319
static const EventRouting bypass_exc SYMBOL_VISIBLE
Definition: neuron.h:337
EventRouting(AnalogOutputMode analog_output, bool enable_digital, bool enable_bypass_excitatory, bool enable_bypass_inhibitory, Address address, bool enable_post_overwrite) SYMBOL_VISIBLE
static const EventRouting bypass_inh SYMBOL_VISIBLE
Definition: neuron.h:338
bool enable_digital
Enable sending a spike packet out of the digital backend.
Definition: neuron.h:310
bool operator!=(EventRouting const &other) const SYMBOL_VISIBLE
haldls::vx::v3::NeuronBackendConfig::AddressOut Address
Definition: neuron.h:294
static const EventRouting enabled SYMBOL_VISIBLE
Definition: neuron.h:336
AnalogOutputMode
Analog output (off/normal/strong) settings.
Definition: neuron.h:303
bool operator==(EventRouting const &other) const SYMBOL_VISIBLE
bool enable_post_overwrite
Enable usage of external post pulses reaching the synapses exclusively.
Definition: neuron.h:325
bool enable_bypass_excitatory
Enable excitatory bypass circuit.
Definition: neuron.h:313
bool enable
Enable exponential term.
Definition: neuron.h:273
AnalogValueVariant v_exp
Threshold voltage for the exponential term.
Definition: neuron.h:276
haldls::vx::v3::NeuronConfig::MembraneCapacitorSize CapacitorSize
Definition: neuron.h:214
Multicompartment configuration of connectivity to adjacent neurons.
Definition: neuron.h:151
haldls::vx::v3::NeuronConfig::ReadoutSource Source
Definition: neuron.h:350
bool enable_unbuffered_access
Enable direct, unbuffered access.
Definition: neuron.h:366
bool enable_amplifier
Enable readout amplifier.
Definition: neuron.h:360
bool enable_buffered_access
Connect the readout amplifier's output to the shared readout lines.
Definition: neuron.h:357
bool enable_pause
Enable gating of synaptic inputs and exponential term during reset periods.
Definition: neuron.h:427
InputClock input_clock
Select between the two input clocks specified in the common neuron backend.
Definition: neuron.h:405
haldls::vx::v3::NeuronBackendConfig::ResetHoldoff ResetHoldoff
Definition: neuron.h:397
haldls::vx::v3::NeuronBackendConfig::InputClock InputClock
Definition: neuron.h:396
ResetHoldoff reset_holdoff
Release the reset potential before the refractory time ends.
Definition: neuron.h:415
RefractoryTime refractory_time
Counter value to control refractory time.
Definition: neuron.h:422
haldls::vx::v3::NeuronBackendConfig::RefractoryTime RefractoryTime
Definition: neuron.h:399
bool operator!=(AtomicNeuron const &other) const SYMBOL_VISIBLE
bool operator==(AtomicNeuron const &other) const SYMBOL_VISIBLE
SynapticInput inhibitory_input
Definition: neuron.h:448
Threshold threshold
Definition: neuron.h:451
Reset reset
Definition: neuron.h:450
MembraneCapacitance membrane_capacitance
Definition: neuron.h:454
friend std::ostream & operator<<(std::ostream &os, AtomicNeuron const &config) SYMBOL_VISIBLE
Leak leak
Definition: neuron.h:449
ConstantCurrent constant_current
Definition: neuron.h:453
EventRouting event_routing
Definition: neuron.h:457
haldls::vx::v2::CapMemCell::DisableRefresh AnalogDisableRefresh
Definition: neuron.h:2
Readout readout
Definition: neuron.h:458
halco::hicann_dls::vx::v2::AtomicNeuronOnDLS coordinate_type
Definition: neuron.h:442
Multicompartment multicompartment
Definition: neuron.h:452
std::false_type has_local_data
Definition: neuron.h:443
haldls::vx::v2::CapMemCell::Value AnalogValue
Definition: neuron.h:1
SynapticInput excitatory_input
Definition: neuron.h:447
RefractoryPeriod refractory_period
Definition: neuron.h:459
haldls::vx::v2::CapMemCell::value_type AnalogValueVariant
Definition: neuron.h:3
Adaptation adaptation
Definition: neuron.h:455
Bayesian bayesian
Definition: neuron.h:460
Exponential exponential
Definition: neuron.h:456
AtomicNeuron() SYMBOL_VISIBLE