/* CTF 1.8 */

/*
 * This file contains the metadata that will become part of an NVIDIA trace
 * after conversion to Common Trace Format.
 *
 * It describes the storage format of the corresponding stream file(s).
 */

typealias integer { size = 8; align = 1; signed = false; } := uint8_t;
typealias integer { size = 16; align = 1; signed = false; } := uint16_t;
typealias integer { size = 32; align = 1; signed = true; } := int32_t;
typealias integer { size = 32; align = 1; signed = false; } := uint32_t;
typealias integer { size = 64; align = 1; signed = true; } := int64_t;
typealias integer { size = 64; align = 1; signed = false; } := uint64_t;

typealias floating_point {
    exp_dig = 8;         /* sizeof(float) * CHAR_BIT - FLT_MANT_DIG */
    mant_dig = 24;       /* FLT_MANT_DIG */
    align = 8;
} := float;

clock {
    name = "monotonic";
    description = "Monotonic Clock";
    freq = 1000000000;
    offset = 0;
};

typealias integer {
    size = 64;
    map = clock.monotonic.value;
    align = 1;
    signed = false;
} := tstamp_ns_t;

trace {
    major = 1;
    minor = 8;
    byte_order = le;
    packet.header := struct {
        uint32_t magic;
        uint32_t stream_id;
    };
};

stream {
    id = 0;
    event.header := struct {
        uint16_t id;
        tstamp_ns_t timestamp;
    };
};

event {
    id = 10;
    name = "runtime_activity";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string activity_type;
        uint64_t process_id;
        int64_t thread_id;
        uint64_t correlation_id;
        int32_t return_value;
        tstamp_ns_t end_timestamp;
        string thread_name;
        string process_name;
    };
};

event {
    id = 11;
    name = "runtime_activity_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 20;
    name = "marker";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string name;
    };
};

event {
    id = 25;
    name = "long_marker";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string name;
        tstamp_ns_t end_timestamp;
    };
};

event {
    id = 26;
    name = "long_marker_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 30;
    name = "memcpy";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string kind;
        string flags;
        tstamp_ns_t end_timestamp;
        uint32_t nv_device_id;
        uint32_t nv_context_id;
        uint32_t nv_stream_id;
        uint64_t correlation_id;
        uint64_t size;
    };
};

event {
    id = 31;
    name = "memcpy_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 40;
    name = "kernel";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string name;
        uint32_t grid_x;
        uint32_t grid_y;
        uint32_t grid_z;
        uint32_t block_x;
        uint32_t block_y;
        uint32_t block_z;
        tstamp_ns_t end_timestamp;
        tstamp_ns_t completed_timestamp;
        uint32_t nv_device_id;
        uint32_t nv_context_id;
        uint32_t nv_stream_id;
        uint64_t correlation_id;
    };
};

event {
    id = 41;
    name = "kernel_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 50;
    name = "driver";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string activity_type;
        uint64_t process_id;
        int64_t thread_id;
        uint64_t correlation_id;
        int32_t return_value;
        tstamp_ns_t end_timestamp;
        string thread_name;        
        string process_name;
    };
};

event {
    id = 51;
    name = "driver_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 60;
    name = "overhead_host";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string activity_type;
        tstamp_ns_t end_timestamp;
        uint64_t process_id;
        uint64_t thread_id;
        string thread_name;
        string process_name;
    };
};

event {
    id = 61;
    name = "overhead_host_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 65;
    name = "overhead_device";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string kind;
        tstamp_ns_t end_timestamp;
        uint32_t nv_device_id;
        uint32_t nv_context_id;
        uint32_t nv_stream_id;        
    };
};

event {
    id = 66;
    name = "overhead_device_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 70;
    name = "memset";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
        string kind;
        string flags;
        tstamp_ns_t end_timestamp;
        uint8_t value;
        uint64_t size;        
        uint32_t nv_device_id;
        uint32_t nv_context_id;
        uint32_t nv_stream_id;
        uint64_t correlation_id;
    };
};

event {
    id = 71;
    name = "memset_end";
    stream_id = 0;
    fields := struct {
        uint64_t activity_id;
    };
};

event {
    id = 80;
    name = "device_name";
    stream_id = 0;
    fields := struct {
        uint32_t device_id;
        string name;
    };
};

event {
    id = 90;
    name = "process_name";
    stream_id = 0;
    fields := struct {
        uint32_t process_id;
        string name;
    };
};

