49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
from ScEpTIC.exceptions import RegAllocException
|
|
|
|
class RegisterPool:
|
|
"""
|
|
Pool of registers used by register allocation to get available registers.
|
|
"""
|
|
|
|
def __init__(self, regs_number, reg_prefix):
|
|
# list of registers state: True -> free; False -> in use
|
|
self.registers = [True for x in range(regs_number)]
|
|
self.regs_number = regs_number
|
|
self.reg_prefix = reg_prefix
|
|
|
|
|
|
def get_reg(self):
|
|
"""
|
|
Returns a free register. If no register is available, it raises a RegAllocException
|
|
The returned register is marked as busy.
|
|
"""
|
|
|
|
for reg_id in range(0, self.regs_number):
|
|
if self.registers[reg_id]:
|
|
# set the register to in use
|
|
self.registers[reg_id] = False
|
|
return '{}{}'.format(self.reg_prefix, reg_id)
|
|
|
|
raise RegAllocException('No register available for register allocation!')
|
|
|
|
|
|
def _get_id_from_reg_name(self, reg_name):
|
|
"""
|
|
Returns the id of a register, given its name.
|
|
"""
|
|
|
|
if reg_name is None:
|
|
return None
|
|
|
|
reg_name = reg_name.replace(self.reg_prefix, '')
|
|
return int(reg_name)
|
|
|
|
|
|
def free_reg(self, reg_name):
|
|
"""
|
|
Marks a given register as free.
|
|
"""
|
|
|
|
reg_id = self._get_id_from_reg_name(reg_name)
|
|
self.registers[reg_id] = True
|