59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
# This file is part of PeachPy package and is licensed under the Simplified BSD license.
|
|
# See license.rst for the full text of the license.
|
|
|
|
active_stream = None
|
|
|
|
|
|
class InstructionStream(object):
|
|
def __init__(self):
|
|
self.instructions = list()
|
|
self.previous_stream = None
|
|
|
|
def __enter__(self):
|
|
global active_stream
|
|
self.previous_stream = active_stream
|
|
active_stream = self
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc_value, traceback):
|
|
global active_stream
|
|
active_stream = self.previous_stream
|
|
self.previous_stream = None
|
|
|
|
def __iter__(self):
|
|
return iter(self.instructions)
|
|
|
|
def __len__(self):
|
|
return len(self.instructions)
|
|
|
|
def __getitem__(self, i):
|
|
try:
|
|
return self.instructions[i]
|
|
except IndexError:
|
|
return None
|
|
|
|
def add_instruction(self, instruction):
|
|
if instruction is not None:
|
|
self.instructions.append(instruction)
|
|
|
|
def issue(self, count=1):
|
|
for i in range(count):
|
|
if self.instructions:
|
|
active_stream.add_instruction(self.instructions.pop(0))
|
|
|
|
|
|
class NullStream:
|
|
def __init__(self):
|
|
self.previous_stream = None
|
|
|
|
def __enter__(self):
|
|
global active_stream
|
|
self.previous_stream = active_stream
|
|
active_stream = None
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc_value, traceback):
|
|
global active_stream
|
|
active_stream = self.previous_stream
|
|
self.previous_stream = None
|