# 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 .field import Field


class RegBlock:
    '''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()
