// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// xbar_${xbar.name} module generated by `tlgen.py` tool
// all reset signals should be generated from one reset signal to not make any deadlock
//
// Interconnect
<%
  import tlgen.lib as lib
%>\
% for host in xbar.hosts:
${xbar.repr_tree(host, 0)}
% endfor

module xbar_${xbar.name} (
% for c in xbar.clocks:
  input ${c},
% endfor
% for r in xbar.resets:
  input ${r},
% endfor

  // Host interfaces
% for node in xbar.hosts:
  input  tlul_pkg::tl_h2d_t tl_${node.name}_i,
  output tlul_pkg::tl_d2h_t tl_${node.name}_o,
% endfor

  // Device interfaces
% for node in xbar.devices:
  output tlul_pkg::tl_h2d_t tl_${node.name}_o,
  input  tlul_pkg::tl_d2h_t tl_${node.name}_i,
% endfor

  input scanmode_i
);

  import tlul_pkg::*;
  import tl_${xbar.name}_pkg::*;

  // scanmode_i is currently not used, but provisioned for future use
  // this assignment prevents lint warnings
  logic unused_scanmode;
  assign unused_scanmode = scanmode_i;

% for block in xbar.nodes:
  ## Create enum type for Upstream and Downstream ports connection
  % if block.node_type.name   == "ASYNC_FIFO":
    ## One US, one DS
  tl_h2d_t tl_${block.name}_us_h2d ;
  tl_d2h_t tl_${block.name}_us_d2h ;
  tl_h2d_t tl_${block.name}_ds_h2d ;
  tl_d2h_t tl_${block.name}_ds_d2h ;

  % elif block.node_type.name == "SOCKET_1N":
    ## One US, multiple DS
  tl_h2d_t tl_${block.name}_us_h2d ;
  tl_d2h_t tl_${block.name}_us_d2h ;

  ##typedef enum int {
  ##  % for port in block.ds:
  ##    % if loop.last:
  ##    % else:
  ##    % endif
  ##  % endfor
  ##} socket_${block.name}_ds_e;

  tl_h2d_t tl_${block.name}_ds_h2d [${len(block.ds)}];
  tl_d2h_t tl_${block.name}_ds_d2h [${len(block.ds)}];

  // Create steering signal
  logic [${len(block.ds).bit_length()-1}:0] dev_sel_${block.name};

  % elif block.node_type.name == "SOCKET_M1":
    ## Multiple US, one DS
    ## typedef enum int {
    ##   % for port in block.us:
    ##     % if loop.last:
    ##     % else:
    ##     % endif
    ##   % endfor
    ## } socket_${block.name}_us_e;

  tl_h2d_t tl_${block.name}_us_h2d [${len(block.us)}];
  tl_d2h_t tl_${block.name}_us_d2h [${len(block.us)}];

  tl_h2d_t tl_${block.name}_ds_h2d ;
  tl_d2h_t tl_${block.name}_ds_d2h ;

  % else:
    ## block is either HOST or DEVICE. Ignore
  % endif
% endfor

% for conn in xbar.edges:
  ## sweep each entry of edges and find each end (us, ds) then connect between
  ## Connect upstream
<%
    if conn.ds.node_type.name == "ASYNC_FIFO":
      ds_h2d_name = 'tl_' + conn.ds.name + '_us_h2d'
      ds_d2h_name = 'tl_' + conn.ds.name + '_us_d2h'
      ds_index = -1
    elif conn.ds.node_type.name == "SOCKET_1N":
      ds_h2d_name = 'tl_' + conn.ds.name + '_us_h2d'
      ds_d2h_name = 'tl_' + conn.ds.name + '_us_d2h'
      ds_index = -1
    elif conn.ds.node_type.name == "SOCKET_M1":
      ds_h2d_name = 'tl_' + conn.ds.name + '_us_h2d'
      ds_d2h_name = 'tl_' + conn.ds.name + '_us_d2h'
      ds_index = conn.ds.us.index(conn)
    elif conn.ds.node_type.name == "DEVICE":
      ds_h2d_name = 'tl_' + conn.ds.name + '_o'
      ds_d2h_name = 'tl_' + conn.ds.name + '_i'
      ds_index = -1

    if conn.us.node_type.name == "ASYNC_FIFO":
      us_h2d_name = 'tl_' + conn.us.name + '_ds_h2d'
      us_d2h_name = 'tl_' + conn.us.name + '_ds_d2h'
      us_index = -1
    elif conn.us.node_type.name == "SOCKET_1N":
      us_h2d_name = 'tl_' + conn.us.name + '_ds_h2d'
      us_d2h_name = 'tl_' + conn.us.name + '_ds_d2h'
      us_index = conn.us.ds.index(conn)
    elif conn.us.node_type.name == "SOCKET_M1":
      us_h2d_name = 'tl_' + conn.us.name + '_ds_h2d'
      us_d2h_name = 'tl_' + conn.us.name + '_ds_d2h'
      us_index = -1
    elif conn.us.node_type.name == "HOST":
      us_h2d_name = 'tl_' + conn.us.name + '_i'
      us_d2h_name = 'tl_' + conn.us.name + '_o'
      us_index = -1
%>\

% if us_index == -1 and ds_index == -1:
  assign ${ds_h2d_name} = ${us_h2d_name};
  assign ${us_d2h_name} = ${ds_d2h_name};
% elif us_index == -1 and ds_index != -1:
  assign ${ds_h2d_name}[${ds_index}] = ${us_h2d_name};
  assign ${us_d2h_name} = ${ds_d2h_name}[${ds_index}];
% elif us_index != -1 and ds_index == -1:
  assign ${ds_h2d_name} = ${us_h2d_name}[${us_index}];
  assign ${us_d2h_name}[${us_index}] = ${ds_d2h_name};
% else:
  assign ${ds_h2d_name}[${ds_index}] = ${us_h2d_name}[${us_index}];
  assign ${us_d2h_name}[${us_index}] = ${ds_d2h_name}[${ds_index}];
% endif
% endfor

% for block in xbar.socket_1ns:
<%
  addr_sig = "tl_" + block.name + "_us_h2d.a_address"
  sel_len = len(block.ds).bit_length()
%>\
  always_comb begin
    // default steering to generate error response if address is not within the range
    dev_sel_${block.name} = ${"%d'd%d" % (sel_len, len(block.ds))};
% for i in block.ds:
<%
  leaf = xbar.get_leaf_from_s1n(block, loop.index);
  name_space = "ADDR_SPACE_" + leaf.name.upper();
  name_mask  = "ADDR_MASK_" + leaf.name.upper();
  prefix = "if (" if loop.first else "end else if ("
%>\
  % if len(leaf.addr_range) == 1:
      % if lib.is_pow2((leaf.addr_range[0][1]-leaf.addr_range[0][0])+1):
    ${prefix}(${addr_sig} & ~(${name_mask})) == ${name_space}) begin
      % else:
    ${prefix}((${addr_sig} <= (${name_mask} + ${name_space})) &&
       (${addr_sig} >= ${name_space}))) begin
      % endif
      dev_sel_${block.name} = ${"%d'd%d" % (sel_len, loop.index)};
${"end" if loop.last else ""}
  % else:
    ## Xbar device port
<%
  num_range = len(leaf.addr_range)
%>\
    ${prefix}
    % for i in range(num_range):
      % if lib.is_pow2(leaf.addr_range[i][1]-leaf.addr_range[0][0]+1):
      ((${addr_sig} & ~(${name_mask}[${i}])) == ${name_space}[${i}])${" ||" if not loop.last else ""}
      % else:
      ((${addr_sig} <= (${name_mask}[${i}] + ${name_space}[${i}])) &&
       (${addr_sig} >= ${name_space}[${i}]))${" ||" if not loop.last else ""}
      % endif
    % endfor
    ) begin
      dev_sel_${block.name} = ${"%d'd%d" % (sel_len, loop.index)};
${"end" if loop.last else ""}
  % endif
% endfor
  end

% endfor

  // Instantiation phase
% for block in xbar.nodes:
  % if block.node_type.name   == "ASYNC_FIFO":
  tlul_fifo_async #(
    .ReqDepth        (3),// At least 3 to make async work
    .RspDepth        (3) // At least 3 to make async work
  ) u_${block.name} (
    .clk_h_i      (${block.clocks[0]}),
    .rst_h_ni     (${block.resets[0]}),
    .clk_d_i      (${block.clocks[1]}),
    .rst_d_ni     (${block.resets[1]}),
    .tl_h_i       (tl_${block.name}_us_h2d),
    .tl_h_o       (tl_${block.name}_us_d2h),
    .tl_d_o       (tl_${block.name}_ds_h2d),
    .tl_d_i       (tl_${block.name}_ds_d2h)
  );
  % elif block.node_type.name == "SOCKET_1N":
  tlul_socket_1n #(
    % if block.hpass != 1:
    .HReqPass  (1'b${block.hpass}),
    .HRspPass  (1'b${block.hpass}),
    % endif
    % if block.hdepth != 2:
    .HReqDepth (4'h${block.hdepth}),
    .HRspDepth (4'h${block.hdepth}),
    % endif
    % if block.dpass != 2**(len(block.ds)) -1:
    .DReqPass  (${len(block.ds)}'h${"%x" % block.dpass}),
    .DRspPass  (${len(block.ds)}'h${"%x" % block.dpass}),
    % endif
    % if block.ddepth != 2:
    .DReqDepth (${len(block.ds)*4}'h${"%x" % block.ddepth}),
    .DRspDepth (${len(block.ds)*4}'h${"%x" % block.ddepth}),
    % endif
    .N         (${len(block.ds)})
  ) u_${block.name} (
    .clk_i        (${block.clocks[0]}),
    .rst_ni       (${block.resets[0]}),
    .tl_h_i       (tl_${block.name}_us_h2d),
    .tl_h_o       (tl_${block.name}_us_d2h),
    .tl_d_o       (tl_${block.name}_ds_h2d),
    .tl_d_i       (tl_${block.name}_ds_d2h),
    .dev_select_i (dev_sel_${block.name})
  );
  % elif block.node_type.name == "SOCKET_M1":
  tlul_socket_m1 #(
    % if block.hpass != 2**(len(block.us)) - 1:
    .HReqPass  (${len(block.us)}'h${"%x" % block.hpass}),
    .HRspPass  (${len(block.us)}'h${"%x" % block.hpass}),
    % endif
    % if block.hdepth != 2:
    .HReqDepth (${len(block.us)*4}'h${"%x" % block.hdepth}),
    .HRspDepth (${len(block.us)*4}'h${"%x" % block.hdepth}),
    % endif
    % if block.dpass != 1:
    .DReqPass  (1'b${block.dpass}),
    .DRspPass  (1'b${block.dpass}),
    % endif
    % if block.ddepth != 2:
    .DReqDepth (4'h${block.ddepth}),
    .DRspDepth (4'h${block.ddepth}),
    % endif
    .M         (${len(block.us)})
  ) u_${block.name} (
    .clk_i        (${block.clocks[0]}),
    .rst_ni       (${block.resets[0]}),
    .tl_h_i       (tl_${block.name}_us_h2d),
    .tl_h_o       (tl_${block.name}_us_d2h),
    .tl_d_o       (tl_${block.name}_ds_h2d),
    .tl_d_i       (tl_${block.name}_ds_d2h)
  );
  % endif
% endfor

endmodule
