예제 #1
0
 def runner(self, code, init=None, pre=None, post=None,
            when=None, name=None,
            level=0):
     '''
     Returns a `CodeRunner` that runs abstract code in the groups namespace
     
     Parameters
     ----------
     code : str
         The abstract code to run.
     init, pre, post : function, optional
         See `CodeRunner`
     when : Scheduler
         When to run, by default in the 'start' slot with the same clock as
         the group.
     name : str
         A unique name, by default the name of the group appended with
         'runner_0', 'runner_1', etc.
     level : int, optional
         How many levels up the stack to go to find values of variables.
     '''
     if when is None: # TODO: make this better with default values
         when = Scheduler(clock=self.clock)
     else:
         raise NotImplementedError
     if name is None:
         if not hasattr(self, 'num_runners'):
             self.num_runners = 0
         name = self.name+'_runner_'+str(self.num_runners)
         self.num_runners += 1
     stmt = Statements(code, level=level+1)
     stmt.resolve(self.units.keys())
     stmt = stmt.frozen()
     abstract_code = stmt.code        
     codeobj = self.create_codeobj("runner",
                                   abstract_code,
                                   self.specifiers,
                                   self.language.template_state_update,
                                   )
     runner = CodeRunner(codeobj, name=name, when=when,
                         init=init, pre=pre, post=post)
     return runner
예제 #2
0
 def create_thresholder(self, threshold, level=1):
     if threshold is None:
         self.thresholder = None
         return
     stmt = Statements('_cond = '+threshold, level=level+1)
     stmt.resolve(self.units.keys()+['_cond'])
     stmt = stmt.frozen()
     abstract_code = stmt.code        
     additional_ns = {
         '_spikes': self.spikes,
         '_spikes_space': zeros(self.N, dtype=int),
         '_array_num_spikes': zeros(1, dtype=int),
         }
     codeobj = self.create_codeobj("thresholder",
                                   abstract_code,
                                   self.specifiers,
                                   self.language.template_threshold,
                                   additional_ns,
                                   )
     self.thresholder_codeobj = codeobj
     self.thresholder = Thresholder(self, codeobj,
                                    name=self.name+'_thresholder',
                                    when=(self.clock, 'thresholds'))
예제 #3
0
 def create_resetter(self, reset, level=1):
     if reset is None:
         self.resetter = None
         return
     specs = self.specifiers
     specs['_neuron_idx'] = Index(all=False)
     stmt = Statements(reset, level=level+1)
     stmt.resolve(self.units.keys())
     stmt = stmt.frozen()
     abstract_code = stmt.code        
     additional_ns = {
         '_spikes': self.spikes,
         '_num_spikes': len(self.spikes),
         }
     codeobj = self.create_codeobj("resetter",
                                   abstract_code,
                                   specs,
                                   self.language.template_reset,
                                   additional_ns,
                                   )
     self.resetter_codeobj = codeobj        
     self.resetter = Resetter(self, codeobj,
                              name=self.name+'_resetter',
                              when=(self.clock, 'resets'))