You probably have to model the fact that gates need time to change their output. You can use a data-structure like this ([1]) to keep an ordered list of events (ordered by the virtual time), and you just work your way down the list, generating new events, until the network is stable.
[1] https://en.wikipedia.org/wiki/Priority_queue