#
# Copyright 2020 Ettus Research, a National Instruments Brand
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
from uhd import chdr
from chdr_resource import rfnoc_packets_data
from chdr_resource import rfnoc_packets_ctrl_mgmt

CHDR_W = chdr.ChdrWidth.W64

def make_control_packet0():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.CTRL
    header.length = 24
    header.dst_epid = 2
    payload = chdr.CtrlPayload()
    payload.src_epid = 1
    payload.set_data([0])
    payload.op_code = chdr.CtrlOpCode.READ
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_control_packet1():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.CTRL
    header.length = 24
    header.dst_epid = 1
    payload = chdr.CtrlPayload()
    payload.src_epid = 2
    payload.is_ack = True
    payload.set_data([0x12C60100])
    payload.op_code = chdr.CtrlOpCode.READ
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_mgmt_packet0():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.MGMT
    header.length = 48
    header.seq_num = 2
    payload = chdr.MgmtPayload()
    payload.set_header(1, (1 << 8) | (0 << 0), chdr.ChdrWidth.W64)
    hop1 = chdr.MgmtHop()
    hop1.add_op(chdr.MgmtOp(chdr.MgmtOpCode.NOP))
    payload.add_hop(hop1)
    hop2 = chdr.MgmtHop()
    hop2.add_op(chdr.MgmtOp(chdr.MgmtOpCode.INFO_REQ, chdr.MgmtOpNodeInfo(0, 0, 0, 0)))
    hop2.add_op(chdr.MgmtOp(chdr.MgmtOpCode.RETURN))
    payload.add_hop(hop2)
    hop3 = chdr.MgmtHop()
    hop3.add_op(chdr.MgmtOp(chdr.MgmtOpCode.NOP))
    payload.add_hop(hop3)
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_mgmt_packet1():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.MGMT
    header.length = 48
    header.seq_num = 3
    payload = chdr.MgmtPayload()
    payload.set_header(1, (1 << 8) | (0 << 0), chdr.ChdrWidth.W64)
    hop1 = chdr.MgmtHop()
    hop1.add_op(chdr.MgmtOp(chdr.MgmtOpCode.NOP))
    payload.add_hop(hop1)
    hop2 = chdr.MgmtHop()
    hop2.add_op(chdr.MgmtOp(chdr.MgmtOpCode.CFG_WR_REQ, chdr.MgmtOpCfg(0x1, 0x2)))
    hop2.add_op(chdr.MgmtOp(chdr.MgmtOpCode.RETURN))
    payload.add_hop(hop2)
    hop3 = chdr.MgmtHop()
    hop3.add_op(chdr.MgmtOp(chdr.MgmtOpCode.NOP))
    payload.add_hop(hop3)
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_mgmt_packet2():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.MGMT
    header.length = 56
    header.seq_num = 6
    payload = chdr.MgmtPayload()
    payload.set_header(1, (1 << 8) | (0 << 0), chdr.ChdrWidth.W64)
    hop1 = chdr.MgmtHop()
    hop1.add_op(chdr.MgmtOp(chdr.MgmtOpCode.NOP))
    payload.add_hop(hop1)
    hop2 = chdr.MgmtHop()
    hop2.add_op(chdr.MgmtOp(chdr.MgmtOpCode.SEL_DEST, chdr.MgmtOpSelDest(3)))
    payload.add_hop(hop2)
    hop3 = chdr.MgmtHop()
    hop3.add_op(chdr.MgmtOp(chdr.MgmtOpCode.INFO_REQ, 0))
    hop3.add_op(chdr.MgmtOp(chdr.MgmtOpCode.RETURN, 0))
    payload.add_hop(hop3)
    hop4 = chdr.MgmtHop()
    hop4.add_op(chdr.MgmtOp(chdr.MgmtOpCode.NOP, 0))
    payload.add_hop(hop4)
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_strs_packet0():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.STRS
    header.length = 40
    header.dst_epid = 2
    payload = chdr.StrsPayload()
    payload.capacity_bytes = 163840
    payload.src_epid = 3
    payload.capacity_pkts = 16777215
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_strs_packet1():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.STRS
    header.length = 40
    header.dst_epid = 2
    payload = chdr.StrsPayload()
    payload.capacity_bytes = 163840
    payload.src_epid = 3
    payload.xfer_count_pkts = 1
    payload.capacity_pkts = 16777215
    payload.xfer_count_bytes = 8000
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_strc_packet0():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.STRC
    header.length = 24
    header.dst_epid = 3
    payload = chdr.StrcPayload()
    payload.num_pkts = 16777215
    payload.op_code = chdr.StrcOpCode.INIT
    payload.src_epid = 2
    payload.num_bytes = 5120
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_strc_packet1():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.STRC
    header.length = 24
    header.dst_epid = 3
    payload = chdr.StrcPayload()
    payload.num_pkts = 21
    payload.op_code = chdr.StrcOpCode.RESYNC
    payload.src_epid = 2
    payload.num_bytes = 168000
    return chdr.ChdrPacket(CHDR_W, header, payload)

def make_data_packet0():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.DATA_WITH_TS
    header.length = 8000
    header.dst_epid = 3
    header.seq_num = 1
    timestamp = 0x7C40C83
    data_src = rfnoc_packets_data.peer1_9
    data = bytes(data_src[(2 * 8):])
    return chdr.ChdrPacket(CHDR_W, header, data, timestamp)

def make_data_packet1():
    header = chdr.ChdrHeader()
    header.pkt_type = chdr.PacketType.DATA_WITH_TS
    header.length = 4252
    header.dst_epid = 3
    header.eob = True
    header.seq_num = 1716
    timestamp = 0x21452B97
    data_src = rfnoc_packets_data.eob_packet
    data = bytes(data_src[(2 * 8):])
    return chdr.ChdrPacket(CHDR_W, header, data, timestamp)

packets = [
    (make_control_packet0(), rfnoc_packets_ctrl_mgmt.peer0_19),
    (make_control_packet1(), rfnoc_packets_ctrl_mgmt.peer1_17),
    (make_mgmt_packet0(), rfnoc_packets_ctrl_mgmt.peer0_2),
    (make_mgmt_packet1(), rfnoc_packets_ctrl_mgmt.peer0_3),
    (make_mgmt_packet2(), rfnoc_packets_ctrl_mgmt.peer0_6),
    (make_strs_packet0(), rfnoc_packets_data.peer0_5),
    (make_strs_packet1(), rfnoc_packets_data.peer0_8),
    (make_strc_packet0(), rfnoc_packets_data.peer1_5),
    (make_strc_packet1(), rfnoc_packets_data.peer1_29),
    (make_data_packet0(), rfnoc_packets_data.peer1_9),
    (make_data_packet1(), rfnoc_packets_data.eob_packet)
]

names = [
    "Control_Packet_0",
    "Control_Packet_1",
    "Management_Packet_0",
    "Management_Packet_1",
    "Management_Packet_2",
    "Stream_Status_Packet_0",
    "Stream_Status_Packet_1",
    "Stream_Command_Packet_0",
    "Stream_Command_Packet_1",
    "Data_Packet_0",
    "Data_Packet_1"
]