# Elmore delay sizing for an interconnect network.

    % Boyd, Kim, Vandenberghe, and Hassibi, "A Tutorial on Geometric Programming"
    % Boyd, Kim, Patil, and Horowitz, "Digital circuit optimization via geometric programming"
    % Written for CVX by Almir Mutapcic 02/08/06
    % (a figure is generated)
    %
    % We consider the problem of finding optimal wire widths w_i
    % of N wire segments in an interconnect network, which will
    % minimize the critical Elmore delay, subject to limits on
    % wire widths and the total circuit area. We use a pi-model
    % for each wire segment. Problem can be formulated as GP:
    %
    %   minimize   D
    %       s.t.   w_min <= w <= w_max
    %              area  <= Amax
    %
    % where variables are widths w (and arrival times T that are used
    % to formulate the overall delay D expression).
    %
    % Important: We label root node as 1, and all the other nodes as
    %            node_label_in_the_paper + 1 (due to Matlab's convention).
    %            Also label nodes with increasing numbers downstream.

    %********************************************************************
    % user supplied data (problem constants and tree topology)
    %********************************************************************
    N = 6; % number of nodes (including the root node which is labeled as 1)

    % parent node array
    % specifies which node is a unique parent for node i (always have a tree)
    parent(1) = 0; % root node does not have a valid parent
    parent(2) = 1;
    parent(3) = 2;
    parent(4) = 3;
    parent(5) = 2;
    parent(6) = 5;

    % problem constants
    Rsource = 0.1;
    l = 1*ones(N-1,1);
    alpha = 1*ones(N-1,1);
    beta  = 1*ones(N-1,1);
    gamma = 1*ones(N-1,1);

    % load capacitance at each node
    C1 = 10; C2 = 10; C3 = 10; C4 = 10; C5 = 10;
    Cload = [0 C1 C2 C3 C4 C5];

    % minimum and maximum width and area specification
    Wmin = 1;
    Wmax = 10;
    Amax = 15;

    %********************************************************************
    % derived data (computed from user's data)
    %********************************************************************
    % compute children cell array (evaluate who are children for each node)
    children = cell(N,1);
    leafs = [];
    for node = [1:N]
      children{node} = find(parent == node);
      if isempty(children{node})
        leafs(end+1) = node; % leafs have no children
      end
    end

    %********************************************************************
    % optimization (generating optimal tradeoff curve)
    %********************************************************************
    % set the quiet flag (no solver reporting)
    cvxq = cvx_quiet(true);

    disp('Generating the tradeoff curve...')

    Darray = [];
    for Amax = [5.05 5.25 5.5 5.75 6:25]
      % formulate the GP problem and solve it
      cvx_begin gp
        % optimization variables
        variable w(N-1)     % wire width
        variable T(N)       % arrival time (Elmore delay to node i)

        % area definition
        area = sum(w.*l);

        % wire segment resistance is inversely proportional to widths
        R = alpha.*l./w;
        R = [Rsource; R];

        % wire segment capacitance is an affine function of widths
        C_bar = beta.*l.*w + gamma.*l;
        C_bar = [0; C_bar];

        % compute common capacitances for each node (C_tilde in GP tutorial)
        C_tilde = cvx( zeros(N,1) );
        for node = [1:N]
          C_tilde(node,1) = Cload(node);
          for k = parent(node)
            if k > 0; C_tilde(node,1) = C_tilde(node,1) + C_bar(k); end;
          end
          for k = children{node}
            C_tilde(node,1) = C_tilde(node,1) + C_bar(k);
          end
        end

        % now compute total downstream capacitances
        C_total = C_tilde;
        for node = N:-1:1
          for k = children{node}
            C_total(node,1) = C_total(node,1) + C_total(k,1);
          end
        end

        % objective is the critical Elmore delay
        minimize( max( T(leafs) ) )
        subject to
          % generate Elmore delay constraints
          R(1)*C_total(1) <= T(1,1);
          for node = 2:N
            R(node)*C_total(node) + T(parent(node),1) <= T(node,1);
          end

          % area and width constraints
          area <= Amax;
          w >= Wmin;
          w <= Wmax;
      cvx_end

      % display and store computed values
      fprintf(1,'  Amax = %5.2f   delay = %3.2f\n',Amax,cvx_optval);
      Darray = [Darray cvx_optval];
    end

    % plot the tradeoff curve
    figure, clf
    Amax = [5.05 5.25 5.5 5.75 6:25];
    plot(Darray,Amax);
    xlabel('Elmore delay D'); ylabel('Amax');

    % restore initial solver reporting state
    cvx_quiet(cvxq);

    Generating the tradeoff curve...
      Amax =  5.05   delay = 107.98
      Amax =  5.25   delay = 98.46
      Amax =  5.50   delay = 90.23
      Amax =  5.75   delay = 84.45
      Amax =  6.00   delay = 80.19
      Amax =  7.00   delay = 69.72
      Amax =  8.00   delay = 63.03
      Amax =  9.00   delay = 58.18
      Amax = 10.00   delay = 54.33
      Amax = 11.00   delay = 51.23
      Amax = 12.00   delay = 48.68
      Amax = 13.00   delay = 46.55
      Amax = 14.00   delay = 44.76
      Amax = 15.00   delay = 43.23
      Amax = 16.00   delay = 41.93
      Amax = 17.00   delay = 40.80
      Amax = 18.00   delay = 39.82
      Amax = 19.00   delay = 38.97
      Amax = 20.00   delay = 38.22
      Amax = 21.00   delay = 37.57
      Amax = 22.00   delay = 36.99
      Amax = 23.00   delay = 36.48
      Amax = 24.00   delay = 36.04
      Amax = 25.00   delay = 35.63