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
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'))
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'))