def driver(self, sim):
r = sim.read<EOL>if self.actualData is NOP and self.data:<EOL><INDENT>self.actualData = self.data.popleft()<EOL><DEDENT>doSend = self.actualData is not NOP<EOL>if self.actualData is not self._lastWritten:<EOL><INDENT>if doSend:<EOL><INDENT>self.doWrite(sim, self.actualData)<EOL><DEDENT>else:<EOL><INDENT>self.doWrite(sim, None)<EOL><DEDENT>self._lastWritten = self.actualData<EOL><DEDENT>en = self.notReset(sim)<EOL>vld = int(en and doSend)<EOL>if self._lastVld is not vld:<EOL><INDENT>self.wrVld(sim.write, vld)<EOL>self._lastVld = vld<EOL><DEDENT>if not self._enabled:<EOL><INDENT>sim.add_process(self.checkIfRdWillBeValid(sim))<EOL>return<EOL><DEDENT>yield sim.waitOnCombUpdate()<EOL>rd = self.isRd(r)<EOL>assert rd.vldMask, (sim.now, self.intf,<EOL>"<STR_LIT>")<EOL>if not vld:<EOL><INDENT>return<EOL><DEDENT>if rd.val:<EOL><INDENT>if self._debugOutput is not None:<EOL><INDENT>self._debugOutput.write("<STR_LIT>" % (<EOL>self.intf._getFullName(),<EOL>sim.now,<EOL>self.actualData))<EOL><DEDENT>a = self.actualData<EOL>if self.data:<EOL><INDENT>self.actualData = self.data.popleft()<EOL><DEDENT>else:<EOL><INDENT>self.actualData = NOP<EOL><DEDENT>onDriverWriteAck = getattr(self, "<STR_LIT>", None)<EOL>if onDriverWriteAck is not None:<EOL><INDENT>onDriverWriteAck(sim)<EOL><DEDENT>onDone = getattr(a, "<STR_LIT>", None)<EOL>if onDone is not None:<EOL><INDENT>onDone(sim)<EOL><DEDENT><DEDENT>
Push data to interface

set vld high and wait on rd in high then pass new data