# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

from typing import List

from reggen.field import Field


class RegBase:
    '''An abstract class inherited by Register and MultiRegister

    This represents a block of one or more registers with a base address.

    '''
    def __init__(self, offset: int):
        self.offset = offset

    def get_n_bits(self, bittype: List[str]) -> int:
        '''Get the size of this register / these registers in bits

        See Field.get_n_bits() for the precise meaning of bittype.

        '''
        raise NotImplementedError()

    def get_field_list(self) -> List[Field]:
        '''Get an ordered list of the fields in the register(s)

        Registers are ordered from low to high address. Within a register,
        fields are ordered as Register.fields: from LSB to MSB.

        '''
        raise NotImplementedError()

    def is_homogeneous(self) -> bool:
        '''True if every field in the block is identical

        For a single register, this is true if it only has one field. For a
        multireg, it is true if the generating register has just one field.
        Note that if the compact flag is set, the generated registers might
        have multiple (replicated) fields.

        '''
        raise NotImplementedError()
