def test_min_spl1_should_allow_external_input_on_same_chip(self):
        """
        Even when the rightmost neuron block / DNC merger is not reserved for external input, it
        should be possible to place external input on the same chip.
        """
        pynn.setup(marocco=self.marocco)
        neuron_size = 4
        self.marocco.neuron_placement.default_neuron_size(neuron_size)
        self.marocco.merger_routing.strategy(
            self.marocco.merger_routing.minimize_number_of_sending_repeaters)
        # Do not reserve rightmost neuron block / DNC merger for external input.
        self.marocco.neuron_placement.restrict_rightmost_neuron_blocks(False)

        hicann = C.HICANNOnWafer(Enum(123))
        pops = []
        # All but the first neuron block are occupied.
        for nb in range(1, C.NeuronBlockOnHICANN.end):
            pop = pynn.Population(1, pynn.IF_cond_exp, {})
            self.marocco.manual_placement.on_neuron_block(
                pop, C.NeuronBlockOnWafer(C.NeuronBlockOnHICANN(nb), hicann))
            pops.append(pop)
        in_pop = pynn.Population(1, pynn.SpikeSourceArray, {})
        self.marocco.manual_placement.on_hicann(in_pop, hicann)

        pynn.run(0)
        pynn.end()

        results = self.load_results()

        for pop in pops:
            nrn = pop[0]
            placement_item, = results.placement.find(nrn)
            logical_neuron = placement_item.logical_neuron()
            self.assertEqual(neuron_size, logical_neuron.size())
            for denmem in logical_neuron:
                self.assertEqual(hicann, denmem.toHICANNOnWafer())
            address = placement_item.address()

            # All used neuron blocks should be connected to a single DNC merger.
            dnc = C.DNCMergerOnHICANN(3)
            self.assertEqual(hicann, address.toHICANNOnWafer())
            self.assertEqual(dnc, address.toDNCMergerOnHICANN())
            self.assertEqual(C.DNCMergerOnWafer(dnc, hicann),
                             address.toDNCMergerOnWafer())

        nrn = in_pop[0]
        placement_item, = results.placement.find(nrn)
        logical_neuron = placement_item.logical_neuron()
        self.assertTrue(logical_neuron.is_external())
        address = placement_item.address()

        # External input must not be on DNC 3 merger, since all other
        # mergers do not have direct access to a background generator.
        dnc = C.DNCMergerOnHICANN(3)
        self.assertEqual(hicann, address.toHICANNOnWafer())
        self.assertNotEqual(dnc, address.toDNCMergerOnHICANN())
        self.assertNotEqual(C.DNCMergerOnWafer(dnc, hicann),
                            address.toDNCMergerOnWafer())
    def test_min_spl1_is_nongreedy_when_pops_are_placed_to_nbs(self, nbs):
        """
        See above.  Instead of a single population placed to the HICANN, populations are placed to
        specific neuron blocks.
        """
        pynn.setup(marocco=self.marocco)
        neuron_size = 4
        self.marocco.neuron_placement.default_neuron_size(neuron_size)
        self.marocco.merger_routing.strategy(
            self.marocco.merger_routing.minimize_number_of_sending_repeaters)
        self.marocco.neuron_placement.restrict_rightmost_neuron_blocks(True)

        hicann = C.HICANNOnWafer(Enum(123))
        pops = []
        for nb in nbs:
            pop = pynn.Population(1, pynn.IF_cond_exp, {})
            self.marocco.manual_placement.on_neuron_block(
                pop, C.NeuronBlockOnWafer(C.NeuronBlockOnHICANN(nb), hicann))
            pops.append(pop)
        in_pop = pynn.Population(1, pynn.SpikeSourceArray, {})
        self.marocco.manual_placement.on_hicann(in_pop, hicann)

        pynn.run(0)
        pynn.end()

        results = self.load_results()

        for pop in pops:
            nrn = pop[0]
            placement_item, = results.placement.find(nrn)
            logical_neuron = placement_item.logical_neuron()
            self.assertEqual(neuron_size, logical_neuron.size())
            for denmem in logical_neuron:
                self.assertEqual(hicann, denmem.toHICANNOnWafer())
            address = placement_item.address()

            # All used neuron blocks should still be connected to a single DNC merger.
            dnc = C.DNCMergerOnHICANN(3)
            self.assertEqual(hicann, address.toHICANNOnWafer())
            self.assertEqual(dnc, address.toDNCMergerOnHICANN())
            self.assertEqual(C.DNCMergerOnWafer(dnc, hicann),
                             address.toDNCMergerOnWafer())

        nrn = in_pop[0]
        placement_item, = results.placement.find(nrn)
        logical_neuron = placement_item.logical_neuron()
        self.assertTrue(logical_neuron.is_external())
        address = placement_item.address()

        # External input should be on the rightmost DNC merger since that is tried first.
        dnc = C.DNCMergerOnHICANN(7)
        self.assertEqual(hicann, address.toHICANNOnWafer())
        self.assertEqual(dnc, address.toDNCMergerOnHICANN())
        self.assertEqual(C.DNCMergerOnWafer(dnc, hicann),
                         address.toDNCMergerOnWafer())
Example #3
0
def hicann_loopback(fpga, h, dnc):
    """
    sets loopback on HICANN, such that channel 0->1, 2->3, etc.
    """
    assert isinstance(h, Handle.HICANN)

    # configure DNC mergers
    mergers = HICANN.DNCMergerLine()
    mer = HICANN.DNCMerger()
    for j in range(8):
        if (j % 2):
            mer.config = HICANN.Merger.RIGHT_ONLY
        else:
            mer.config = HICANN.Merger.LEFT_ONLY
        mer.slow = False
        mer.loopback = not (j % 2)  # 0->1, 2->3 etc...
        mergers[Coordinate.DNCMergerOnHICANN(j)] = mer
    HICANN.set_dnc_merger(h, mergers)

    gbit = DNC.GbitReticle()

    link = HICANN.GbitLink()
    for i in range(8):
        if (i % 2):
            link.dirs[i] = HICANN.GbitLink.Direction.TO_DNC
        else:
            link.dirs[i] = HICANN.GbitLink.Direction.TO_HICANN

    gbit[h.to_HICANNOnDNC()] = link

    HICANN.set_gbit_link(h, link)
    DNC.set_hicann_directions(fpga, dnc, gbit)

    # make sure to switch off dnc loopback
    DNC.set_loopback(fpga, dnc, DNC.Loopback())
    def test_hw_merging_spl1_should_merge_some(self):
        """
        some DNCs shall be merged, but not all, because of syndriver
        requirements on each NB. 2 neurons will be placed (same HICANN).
        A fully connected network is built.
        This results in 8*2 = 16 synapses being routed to each neuron.
        With neuron size 4 and chain length 3 -> 12 synapses can be realised
        on each neuron. As a result at maximum 12 synapses shall be on the
        same L1Route. The merger tries to merge them and will fail, then spit
        it and merge 8 to each merger [3,5].

        The result is a better L1 utilisation compared to one-to-one mapping,
        2 instead of 8 routes, while staying within hardware constrains,
        compared to merge all (16 synapses requiring 4 drivers, 1 driver will
        be lost).
        """
        pynn.setup(marocco=self.marocco)
        neuron_size = 4
        self.marocco.neuron_placement.default_neuron_size(neuron_size)
        self.marocco.merger_routing.strategy(
            self.marocco.merger_routing.minimize_as_possible)
        # restrict to 3 driver, so that this test is hardware agnostic
        self.marocco.synapse_routing.driver_chain_length(3)

        hicann = C.HICANNOnWafer(Enum(123))
        pops = []
        # All but the first neuron block are occupied.
        for nb in range(C.NeuronBlockOnHICANN.end):
            pop = pynn.Population(2, pynn.IF_cond_exp, {})
            self.marocco.manual_placement.on_neuron_block(
                pop, C.NeuronBlockOnWafer(C.NeuronBlockOnHICANN(nb), hicann))
            pops.append(pop)

        for p in pops:
            for other_p in pops:
                pynn.Projection(p, other_p, pynn.AllToAllConnector(weights=1.))

        pynn.run(0)
        pynn.end()

        merged_dncs = [3, 3, 3, 3, 5, 5, 5, 5]

        results = self.load_results()

        for pop in pops:
            nrn = pop[0]
            placement_item, = results.placement.find(nrn)
            logical_neuron = placement_item.logical_neuron()
            self.assertEqual(neuron_size, logical_neuron.size())
            for denmem in logical_neuron:
                self.assertEqual(hicann, denmem.toHICANNOnWafer())
            address = placement_item.address()

            # some DNCs shall be merged.
            dnc = C.DNCMergerOnHICANN(merged_dncs[pop.euter_id()])
            self.assertEqual(hicann, address.toHICANNOnWafer())
            self.assertEqual(dnc, address.toDNCMergerOnHICANN())
            self.assertEqual(C.DNCMergerOnWafer(dnc, hicann),
                             address.toDNCMergerOnWafer())
    def test_FIFO_loopback(self):
        loop = False
        mergers = HICANN.DNCMergerLine()
        mer = HICANN.DNCMerger()
        for j in range(8):
            if (j % 2): mer.config = HICANN.Merger.RIGHT_ONLY
            else: mer.config = HICANN.Merger.LEFT_ONLY
            mer.slow = False
            mer.loopback = not (j % 2)
            mergers[Coordinate.DNCMergerOnHICANN(j)] = mer

        HICANN.set_dnc_merger(self.h, mergers)

        gbit = DNC.GbitReticle()
        link = HICANN.GbitLink()
        for i in range(8):
            if (i % 2): link.dirs[i] = HICANN.GbitLink.Direction.TO_DNC
            else: link.dirs[i] = HICANN.GbitLink.Direction.TO_HICANN

        gbit[self.h.to_HICANNOnDNC()] = link
        HICANN.set_gbit_link(self.h, link)
        DNC.set_hicann_directions(self.fpga, self.dnc, gbit)

        sent_data = []
        received_data = FPGA.PulseEventContainer()
        sent_data.clear()
        received_data.clear()
        GbitLinkOnHICANN = Coordinate.GbitLinkOnHICANN

        for i in range(500):  #500 events, first spike getTime non-zero
            sent_data.append(
                FPGA.PulseEvent(
                    self.h.to_DNCOnFPGA(),  #DNC-number (1 for vertical setup)
                    self.h.to_HICANNOnDNC(),  #HICANN number 0
                    GbitLinkOnHICANN(0),  #channel number 0
                    HICANN.L1Address(0),  #neuron number 0
                    500 * i + 500))  #every 500 cycles

        #send and receive events
        received_data = FPGA.send_and_receive(
            self.fpga, self.dnc, FPGA.PulseEventContainer(sent_data), loop,
            100000)  #0,1 seconds

        for i in range(8):
            link.dirs[i] = HICANN.GbitLink.Direction.OFF
        for i in range(8):
            gbit[Coordinate.HICANNOnDNC(Enum(i))] = link

        HICANN.set_gbit_link(self.h, link)
        DNC.set_hicann_directions(self.fpga, self.dnc, gbit)
        HICANN.flush(self.h)  #flush to hardware

        print(len(sent_data), " packets sent, ", received_data.size(),
              " received")
        self.assertEqual(len(sent_data), received_data.size())
    def L1TransmissionTest(self, block):
        #period between events used in testing below
        period = 150

        #set PLL frequency
        #HICANN.set_PLL_frequency(self.h, 100)

        #configure DNC mergers
        mergers = HICANN.DNCMergerLine()
        for i in range(8):
            mer = Coordinate.DNCMergerOnHICANN(i)
            mergers[mer].config = HICANN.Merger.RIGHT_ONLY
            mergers[mer].slow = True
            mergers[mer].loopback = False
        HICANN.set_dnc_merger(self.h, mergers)

        #configure merger tree, phase
        tree = HICANN.MergerTree()  #default settings are OK
        phase = HICANN.phase_t(0)
        HICANN.set_merger_tree(self.h, tree)
        HICANN.set_phase(self.h, phase)

        #configure background generator
        bgarray = HICANN.BackgroundGeneratorArray()
        for i in range(8):
            bgarray[i].enable(True)
            bgarray[i].random(False)
            bgarray[i].seed(200)
            bgarray[i].period(period)
            bgarray[i].address(HICANN.L1Address(0))
        HICANN.set_background_generator(self.h, bgarray)

        #configure sending repeaters
        rep = Coordinate.RepeaterBlockOnHICANN(Coordinate.X(0),
                                               Coordinate.Y(1))
        HICANN.set_repeater_block(self.h, rep, HICANN.RepeaterBlock())
        sr = HICANN.HorizontalRepeater()
        sr.setOutput(Coordinate.right)
        for i in range(8):
            HICANN.set_repeater(self.h,
                                Coordinate.HLineOnHICANN(6 + 8 * i).repeater(),
                                sr)

        #configure crossbars and synapse switches
        cb = HICANN.Crossbar()
        ss = HICANN.SynapseSwitch()
        row_cfg = HICANN.CrossbarRow()
        syn_row_cfg = HICANN.SynapseSwitchRow()

        for i in range(8):
            if block.x().value() == 0 and block.y().value() == 2:
                cb.set(Coordinate.VLineOnHICANN(28 - 4 * i),
                       Coordinate.HLineOnHICANN(6 + 8 * i), True)
                row_cfg = cb.get_row(Coordinate.HLineOnHICANN(6 + 8 * i),
                                     Coordinate.left)
                HICANN.set_crossbar_switch_row(
                    self.h, Coordinate.HLineOnHICANN(6 + 8 * i),
                    Coordinate.left, row_cfg)

            elif block.x().value() == 1 and block.y().value() == 2:
                cb.set(Coordinate.VLineOnHICANN(227 + 4 * i),
                       Coordinate.HLineOnHICANN(6 + 8 * i), True)
                row_cfg = cb.get_row(Coordinate.HLineOnHICANN(6 + 8 * i),
                                     Coordinate.right)
                HICANN.set_crossbar_switch_row(
                    self.h, Coordinate.HLineOnHICANN(6 + 8 * i),
                    Coordinate.right, row_cfg)

            elif block.x().value() == 0 and block.y().value() == 0:
                addr = Coordinate.SynapseSwitchRowOnHICANN(
                    Coordinate.Y(15 - 2 * i), Coordinate.left)
                cb.set(Coordinate.VLineOnHICANN(28 - 4 * i),
                       Coordinate.HLineOnHICANN(6 + 8 * i), True)
                ss.set(Coordinate.VLineOnHICANN(28 - 4 * i), addr.line(),
                       True)  #connecting two parallel vertical lanes
                ss.set(Coordinate.VLineOnHICANN(29 - 4 * i), addr.line(), True)
                row_cfg = cb.get_row(Coordinate.HLineOnHICANN(6 + 8 * i),
                                     Coordinate.left)
                HICANN.set_crossbar_switch_row(
                    self.h, Coordinate.HLineOnHICANN(6 + 8 * i),
                    Coordinate.left, row_cfg)
                syn_row_cfg = ss.get_row(addr)
                HICANN.set_syndriver_switch_row(self.h, addr, syn_row_cfg)

            elif block.x().value() == 1 and block.y().value() == 0:
                addr = Coordinate.SynapseSwitchRowOnHICANN(
                    Coordinate.Y(15 - 2 * i), Coordinate.right)
                cb.set(Coordinate.VLineOnHICANN(227 + 4 * i),
                       Coordinate.HLineOnHICANN(6 + 8 * i), True)
                ss.set(Coordinate.VLineOnHICANN(227 + 4 * i), addr.line(),
                       True)  #connecting two parallel vertical lanes
                ss.set(Coordinate.VLineOnHICANN(226 + 4 * i), addr.line(),
                       True)
                row_cfg = cb.get_row(Coordinate.HLineOnHICANN(6 + 8 * i),
                                     Coordinate.right)
                HICANN.set_crossbar_switch_row(
                    self.h, Coordinate.HLineOnHICANN(6 + 8 * i),
                    Coordinate.right, row_cfg)
                syn_row_cfg = ss.get_row(addr)
                HICANN.set_syndriver_switch_row(self.h, addr, syn_row_cfg)

            elif block.x().value() == 1 and block.y().value() == 1:
                cb.set(Coordinate.VLineOnHICANN(28 - 4 * i),
                       Coordinate.HLineOnHICANN(6 + 8 * i), True)
                cb.set(Coordinate.VLineOnHICANN(28 - 4 * i),
                       Coordinate.HLineOnHICANN(7 + 8 * i), True)
                row_cfg = cb.get_row(Coordinate.HLineOnHICANN(6 + 8 * i),
                                     Coordinate.left)
                HICANN.set_crossbar_switch_row(
                    self.h, Coordinate.HLineOnHICANN(6 + 8 * i),
                    Coordinate.left, row_cfg)
                row_cfg = cb.get_row(Coordinate.HLineOnHICANN(7 + 8 * i),
                                     Coordinate.left)
                HICANN.set_crossbar_switch_row(
                    self.h, Coordinate.HLineOnHICANN(7 + 8 * i),
                    Coordinate.left, row_cfg)

        #readout-routine
        vr = HICANN.VerticalRepeater()
        rb = HICANN.RepeaterBlock()
        startrep = 0  #starting readout-repeater
        registertype = HICANN.RepeaterBlock.EVEN  #which readout-circuit is responsible
        dir = Coordinate.top  #transmit-direction

        if block.x().value() == 0 and block.y().value() == 2:
            startrep = 0
            registertype = HICANN.RepeaterBlock.EVEN
            dir = Coordinate.bottom
        elif block.x().value() == 1 and block.y().value() == 2:
            startrep = 227
            registertype = HICANN.RepeaterBlock.EVEN
            dir = Coordinate.bottom
        elif block.x().value() == 0 and block.y().value() == 0:
            startrep = 1
            registertype = HICANN.RepeaterBlock.ODD
            dir = Coordinate.top
        elif block.x().value() == 1 and block.y().value() == 0:
            startrep = 226
            registertype = HICANN.RepeaterBlock.ODD
            dir = Coordinate.top

        success_counter = 0

        # unfortunately center right readout routine is too different...
        if not (block.x().value() == 1 and block.y().value() == 1):
            for i in range(startrep, startrep + 32, 4):
                #configure receiving repeater
                vr.setInput(dir)
                HICANN.set_repeater(self.h,
                                    Coordinate.VLineOnHICANN(i).repeater(), vr)
                HICANN.flush(self.h)

                t.sleep(0.0005)  #time for the dll to lock

                #configure receiving repeater block
                rb.start_tdi[registertype] = False  #reset the full flag
                HICANN.set_repeater_block(self.h, block, rb)
                rb.start_tdi[
                    registertype] = True  #start recording received data
                HICANN.set_repeater_block(self.h, block, rb)
                HICANN.flush(self.h)

                t.sleep(0.001)  #recording lasts for ca. 4 us - 1 ms

                rb = HICANN.get_repeater_block(self.h, block)
                test = rb.tdi_data[registertype]

                for x in range(
                        2
                ):  #see how many events come with correct delay (+/- 2)
                    if ((abs(abs(test[x + 1].time - test[x].time) - period)) <
                            3):
                        success_counter += 1

                #~ print "From repeater " + str(i) + " received: "
                #~ if rb.full_flag[registertype]:
                #~ print "Full flag is set"
                #~ else:
                #~ print "Full flag is NOT set"
                #~ print "Neuron number " + str(test[0].address) + " at time " + str(test[0].time)
                #~ print "Neuron number " + str(test[1].address) + " at time " + str(test[1].time)
                #~ print "Neuron number " + str(test[2].address) + " at time " + str(test[2].time) + "\n"

                rb.start_tdi[
                    registertype] = False  #reset the full flag TWO (!) times
                HICANN.set_repeater_block(self.h, block, rb)
                HICANN.set_repeater_block(self.h, block, rb)

                #set repeater mode to IDLE to prevent conflicts
                vr.setIdle()
                HICANN.set_repeater(self.h,
                                    Coordinate.VLineOnHICANN(i).repeater(), vr)
        else:
            hr = HICANN.HorizontalRepeater()
            for i in range(7, 64, 8):
                #configure receiving repeater
                hr.setInput(Coordinate.right)
                HICANN.set_repeater(self.h,
                                    Coordinate.HLineOnHICANN(i).repeater(), hr)
                HICANN.flush(self.h)

                t.sleep(0.0005)  #time for the dll to lock

                #configure receiving repeater block
                rb.start_tdi[
                    HICANN.RepeaterBlock.EVEN] = False  #reset the full flag
                HICANN.set_repeater_block(self.h, block, rb)
                rb.start_tdi[HICANN.RepeaterBlock.
                             EVEN] = True  #start recording received data
                HICANN.set_repeater_block(self.h, block, rb)
                HICANN.flush(self.h)

                t.sleep(0.0001)  #recording lasts for ca. 4 us - 1 ms

                rb = HICANN.get_repeater_block(self.h, block)
                test = rb.tdi_data[HICANN.RepeaterBlock.EVEN]

                #~ print "From repeater " + str(i) + " received: "
                #~ if rb.full_flag[registertype]:
                #~ print "Full flag is set"
                #~ else:
                #~ print "Full flag is NOT set"
                #~ print "Neuron number " + str(test[0].address) + " at time " + str(test[0].time)
                #~ print "Neuron number " + str(test[1].address) + " at time " + str(test[1].time)
                #~ print "Neuron number " + str(test[2].address) + " at time " + str(test[2].time) + "\n"

                for x in range(
                        2):  #see how many events come with correct delay
                    if ((abs(abs(test[x + 1].time - test[x].time) - period)) <
                            3):
                        success_counter += 1

                rb.start_tdi[HICANN.RepeaterBlock.
                             EVEN] = False  #reset the full flag TWO (!) times
                HICANN.set_repeater_block(self.h, block, rb)
                HICANN.set_repeater_block(self.h, block, rb)

                #set repeater mode to IDLE to prevent conflicts
                hr.setIdle()
                HICANN.set_repeater(self.h,
                                    Coordinate.HLineOnHICANN(i).repeater(), hr)
        HICANN.flush(self.h)
        return success_counter
    def test_FPGABEGTest(self):
        #configure DNC mergers
        mergers = HICANN.DNCMergerLine()
        for i in range(8):
            j = Coordinate.DNCMergerOnHICANN(i)
            if (i % 2): mergers[j].config = HICANN.Merger.RIGHT_ONLY
            else: mergers[j].config = HICANN.Merger.LEFT_ONLY
            mergers[j].slow = False
            mergers[j].loopback = not (i % 2)
        HICANN.set_dnc_merger(self.h, mergers)

        #configure DNC<->HICANN links
        gbit = DNC.GbitReticle()
        link = HICANN.GbitLink()
        for i in range(8):
            if (i % 2): link.dirs[i] = HICANN.GbitLink.Direction.TO_DNC
            else: link.dirs[i] = HICANN.GbitLink.Direction.TO_HICANN

        gbit[self.h.to_HICANNOnDNC()] = link
        HICANN.set_gbit_link(self.h, link)
        DNC.set_hicann_directions(self.fpga, self.dnc, gbit)

        #configure FPGA Background Generator
        bg = FPGA.BackgroundGenerator()
        bg.enable = True
        bg.poisson = False
        bg.seed = 12345  #cannot be zero
        bg.rate = 300  #in DNC-clock cycles
        bg.first_address = 2
        bg.last_address = 3  #last address is greater or equal than first
        bg.hicann_number = self.h.coordinate().onDNC()
        bg.channels[0] = True  #set active channels
        bg.channels[2] = True
        bg.channels[4] = True
        bg.channels[6] = True
        FPGA.set_fpga_background_generator(self.fpga, self.dnc, bg)
        HICANN.flush(self.h)

        #generate data container and receive data
        data = FPGA.PulseEventContainer()
        data.clear()
        data = FPGA.receive(self.fpga, self.dnc, 50000)  #0,05 seconds

        print(str(data.size()) + " packets received")
        self.assertNotEqual(0, data.size())

        number_count = 0
        channel_count = 0
        numbers = []
        channels = []
        for i in range(data.size()):
            numbers.append(int(data[i].getNeuronAddress()))
            channels.append(data[i].getChannel().value())
        for j in range(64):
            if (numbers.count(j)): number_count += 1
        for k in range(8):
            if (channels.count(k)): channel_count += 1

        #check if number of different neuron numbers matches
        self.assertEqual(bg.last_address - bg.first_address + 1, number_count)

        #check if number of used channels matches
        self.assertEqual(bg.channels.count(), channel_count)

        #turn the BEG off
        bg.enable = False
        FPGA.set_fpga_background_generator(self.fpga, self.dnc, bg)

        #turn off the links to prevent packet collision
        for hicann in Coordinate.iter_all(Coordinate.HICANNOnDNC):
            link.dirs[hicann.toEnum().value()] = HICANN.GbitLink.Direction.OFF
            gbit[hicann] = link
        HICANN.set_gbit_link(self.h, link)
        DNC.set_hicann_directions(self.fpga, self.dnc, gbit)
        HICANN.flush(self.h)
    def test_NeuronCurrentStimHWTest(self):
        fgc = HICANN.FGControl()
        fg_config = HICANN.FGConfig()
        for block in [Enum(0), Enum(1)]:
            block = Coordinate.FGBlockOnHICANN(block)
            HICANN.set_fg_config(self.h, block, fg_config)
            HICANN.set_fg_values(self.h, block, fgc.getBlock(block))

        # 2nd: configure the neuron
        nrn = HICANN.Neuron()
        #HICANN.Neuron other_nrn = HICANN.Neuron()

        nrn.address(HICANN.L1Address(42))
        nrn.activate_firing(True)
        nrn.enable_spl1_output(True)
        nrn.enable_fire_input(False)
        nrn.enable_aout(True)
        nrn.enable_current_input(True)

        nquad = HICANN.NeuronQuad()
        nquad[Coordinate.NeuronOnQuad(X(0), Y(0))] = nrn

        HICANN.set_denmem_quad(self.h, Coordinate.QuadOnHICANN(0), nquad)

        # NEURON CONFIG
        nrn_cfg = HICANN.NeuronConfig()
        nrn_cfg.bigcap.set(Coordinate.top)

        HICANN.set_neuron_config(self.h, nrn_cfg)

        # set ANALOG
        ac = HICANN.Analog()
        ac.set_membrane_top_even(Coordinate.AnalogOnHICANN(0))
        HICANN.set_analog(self.h, ac)

        # CURRENT STIMULUS
        fg_config = HICANN.FGConfig()
        fg_config.pulselength = 15
        for block in [Enum(0), Enum(1)]:
            block = Coordinate.FGBlockOnHICANN(block)
            HICANN.set_fg_config(self.h, block, fg_config)

        stimulus = HICANN.FGStimulus()
        stimulus.setContinuous(True)
        stimulus[:40] = [800] * 40
        stimulus[40:] = [0] * (len(stimulus) - 40)
        HICANN.set_current_stimulus(self.h,
                                    Coordinate.FGBlockOnHICANN(Enum(0)),
                                    stimulus)

        # READOUT PULSES!
        #configure merger tree, phase
        tree = HICANN.MergerTree()
        #default settings are OK
        HICANN.set_merger_tree(self.h, tree)
        HICANN.set_phase(self.h)

        dnc_mergers = HICANN.DNCMergerLine()
        for i in range(8):
            # rcv from HICANN
            mer = Coordinate.DNCMergerOnHICANN(i)
            dnc_mergers[mer].config = HICANN.Merger.RIGHT_ONLY
            dnc_mergers[mer].slow = False
            dnc_mergers[mer].loopback = False
        HICANN.set_dnc_merger(self.h, dnc_mergers)

        # DNC and dnc_if:
        gbit = Coordinate.GbitLinkOnHICANN(0)
        gl = HICANN.GbitLink()
        gl.dirs[gbit.value()] = HICANN.GbitLink.Direction.TO_DNC

        gr = DNC.GbitReticle()
        gr[self.h.to_HICANNOnDNC()] = gl

        HICANN.set_gbit_link(self.h, gl)
        DNC.set_hicann_directions(self.fpga, self.dnc, gr)
        HICANN.flush(self.h)

        rec_pulses = FPGA.receive(self.fpga, self.dnc, 10000)
        # 10 ms

        print(str(rec_pulses.size()) + " packets received")
        self.assertGreater(rec_pulses.size(), 0)

        # Check for correct addrss of spikes
        for np in range(rec_pulses.size()):
            pulse = rec_pulses.get(np)
            self.assertEqual(HICANN.L1Address(42), pulse.getNeuronAddress())
            self.assertEqual(gbit, pulse.getChannel())
            self.assertEqual(self.hicann, pulse.getChipAddress())
            self.assertEqual(self.dnc, pulse.getDncAddress())

        #turn off links
        gl.dirs[0] = HICANN.GbitLink.Direction.OFF
        gr[Coordinate.HICANNOnDNC(Enum(0))] = gl
        HICANN.set_gbit_link(self.h, gl)
        DNC.set_hicann_directions(self.fpga, self.dnc, gr)
        HICANN.flush(self.h)
Example #9
0
# Setup Gbit Links and merger tree
sending_link = Coordinate.GbitLinkOnHICANN(0)
hicann.layer1[sending_link] = pyhalbe.HICANN.GbitLink.Direction.TO_HICANN

receiving_link = Coordinate.GbitLinkOnHICANN(1)
hicann.layer1[receiving_link] = pyhalbe.HICANN.GbitLink.Direction.TO_DNC

for m in iter_all(Coordinate.DNCMergerOnHICANN):
     m = hicann.layer1[merger]
     m.config = m.MERGE
     m.slow = False
     m.loopback = False

# sending link should loopback to receiving link
m = hicann.layer1[Coordinate.DNCMergerOnHICANN(sending_link.value())]
m.loopback = True

# Construct input spike train
spikes_raw = np.arange(20) * 1e-6 + 10e-6
more_spikes_raw = np.arange(20) * 1e-6 + spikes_raw[-1]*2
spikes_raw = np.concatenate([spikes_raw, more_spikes_raw])
duration  = spikes_raw[-1] + 30e-6

spikes = pysthal.Vector_Spike()
for t in spikes_raw:
    spikes.append(pysthal.Spike(in_addr, t))

hicann.sendSpikes(sending_link, spikes)

print(hicann)