// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// xbar_cover.cfg generated by `tlgen.py` tool
<%
  import math
  import tlgen.lib as lib

  num_hosts = len(xbar.hosts)
  if num_hosts > 1:
    host_unr_source_bits = math.ceil(math.log2(num_hosts))
  else:
    host_unr_source_bits = 0
%>\

+tree tb.dut
-module pins_if     // DV construct.
-module clk_rst_if  // DV construct.

// due to VCS issue (fixed at VCS/2020.12), can't move this part into begin...end (tgl) or after.
-node tb.dut tl_*.a_param
-node tb.dut tl_*.d_param
-node tb.dut tl_*.d_opcode[2:1]

// [UNR] these device address bits are always 0
% for device in xbar.devices:
<%
    excl_bits = lib.get_toggle_excl_bits(device.addr_range)

    esc_name = device.name.replace('.', '__')
%>\
  % for bit_range in excl_bits:
-node tb.dut tl_${esc_name}_o.a_address[${bit_range[1]}:${bit_range[0]}]
  % endfor
% endfor

% if host_unr_source_bits > 0:
-node tb.dut tl_*.a_source[7:${8 - host_unr_source_bits}]
-node tb.dut tl_*.d_source[7:${8 - host_unr_source_bits}]
% endif
begin tgl
  -tree tb
  +tree tb.dut 1
  -node tb.dut.scanmode_i
end

