示例#1
0
    def connect(s, other, parent):
        # We are doing GiveIfcRTL (s) -> [ AND ] -> RecvIfcRTL (other)
        # Basically we AND the rdy of both sides for enable
        if isinstance(other, RecvIfcRTL):
            connect(s.ret, other.msg)

            m = And(Bits1)

            if hasattr(parent, "give_recv_ander_cnt"):
                cnt = parent.give_recv_ander_cnt
                setattr(parent, "give_recv_ander_" + str(cnt), m)
            else:
                parent.give_recv_ander_cnt = 0
                parent.give_recv_ander_0 = m

            connect_pairs(
                m.in0,
                s.rdy,
                m.in1,
                other.rdy,
                m.out,
                s.en,
                m.out,
                other.en,
            )
            parent.give_recv_ander_cnt += 1
            return True

        elif isinstance(other, CalleeIfcCL):
            if s._dsl.level <= other._dsl.level:
                raise InvalidConnectionError(
                    "CL2RTL connection is not supported between RecvIfcRTL"
                    " and CalleeIfcCL.\n"
                    "          - level {}: {} (class {})\n"
                    "          - level {}: {} (class {})".format(
                        s._dsl.level, repr(s), type(s), other._dsl.level,
                        repr(other), type(other)))

            m = GetRTL2GiveCL(s.MsgType)

            if hasattr(parent, "GetRTL2GiveCL_count"):
                count = parent.GetRTL2GiveCL_count
                setattr(parent, "GetRTL2GiveCL_" + str(count), m)
            else:
                parent.GetRTL2GiveCL_count = 0
                parent.GetRTL2GiveCL_0 = m

            connect_pairs(
                s,
                m.get,
                m.give,
                other,
            )
            parent.GetRTL2GiveCL_count += 1
            return True

        return False
示例#2
0
  def connect( s, other, parent ):

    # We are doing SendCL (other) -> [ RecvCL -> SendRTL ] -> RecvRTL (s)
    # SendCL is a caller interface
    if isinstance( other, CallerIfcCL ):
      m = RecvCL2SendRTL( s.MsgType )

      if hasattr( parent, "RecvCL2SendRTL_count" ):
        count = parent.RecvCL2SendRTL_count
        setattr( parent, "RecvCL2SendRTL_" + str( count ), m )
      else:
        parent.RecvCL2SendRTL_count = 0
        parent.RecvCL2SendRTL_0 = m

      connect_pairs(
        other,  m.recv,
        m.send.msg, s.msg,
        m.send.en,  s.en,
        m.send.rdy, s.rdy
      )
      parent.RecvCL2SendRTL_count += 1
      return True

    elif isinstance( other, CalleeIfcCL ):
      if s._dsl.level <= other._dsl.level:
        raise InvalidConnectionError(
            "CL2RTL connection is not supported between RecvIfcRTL"
            " and CalleeIfcCL.\n"
            "          - level {}: {} (class {})\n"
            "          - level {}: {} (class {})".format(
                s._dsl.level, repr( s ), type( s ), other._dsl.level,
                repr( other ), type( other ) ) )

      m = RecvCL2SendRTL( s.MsgType )

      if hasattr( parent, "RecvCL2SendRTL_count" ):
        count = parent.RecvCL2SendRTL_count
        setattr( parent, "RecvCL2SendRTL_" + str( count ), m )
      else:
        parent.RecvCL2SendRTL_count = 0
        parent.RecvCL2SendRTL_0 = m

      connect_pairs(
        other,  m.recv,
        m.send.msg, s.msg,
        m.send.en,  s.en,
        m.send.rdy, s.rdy
      )
      parent.RecvCL2SendRTL_count += 1
      return True

    return False