Check if the capabilities of a primitive are enough to satisfy a requirement.

        Should be called on a Requirement that is acting as a
        capability of a primitive. This method returning true means
        that the capability advertised here is enough to handle
        representing the data described by the Requirement passed in
        as 'other'.

        Here is a chart showing what satisfies what.

             other
              A C 0 1
           |Y N N N N
        s A|Y Y Y Y Y
        e C|Y - Y Y Y
        l 0|Y * * Y N
        f 1|Y * * N Y

        ' ' = No Care
        A = arbitrary
        C = Constant
        0 = ZERO
        1 = ONE

        Y = YES
        N = NO
        - = Could satisfy with multiple instances
        * = Not yet determined behavior. Used for bitbanging controllers.

def satisfies(self, other):
        """Check if the capabilities of a primitive are enough to satisfy a requirement.

        Should be called on a Requirement that is acting as a
        capability of a primitive. This method returning true means
        that the capability advertised here is enough to handle
        representing the data described by the Requirement passed in
        as 'other'.

        Here is a chart showing what satisfies what.

             other
              A C 0 1
           |Y N N N N
        s A|Y Y Y Y Y
        e C|Y - Y Y Y
        l 0|Y * * Y N
        f 1|Y * * N Y

        ' ' = No Care
        A = arbitrary
        C = Constant
        0 = ZERO
        1 = ONE

        Y = YES
        N = NO
        - = Could satisfy with multiple instances
        * = Not yet determined behavior. Used for bitbanging controllers.

        """
        if other.isnocare:
            return True
        if self.isnocare:
            return False
        if self.arbitrary:
            return True
        if self.constant and not other.arbitrary:
            return True
        if self.value is other.value and not other.arbitrary\
           and not other.constant:
            return True
        return False