2026-07-10 10:38:57 +02:00

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