📄 dig_ckt_sizing.m
字号:
% Digital circuit sizing example.% (a figure is generated if the tradeoff flag is turned on)%% This is an example taken directly from the paper:%% Digital Circuit Optimization via Geometric Programming% by Boyd, Kim, Patil, and Horowitz.% Operations Research 53(6): 899-932, 2005.%% Solves the problem of choosing gate scale factors x_i to give% minimum ckt delay, subject to limits on the total area and power.% Uses max gate arrival time T formulation that avoids evaluation% of the delay over all paths in the circuit.%% minimize T_bar% s.t. T_j <= T_bar for j an output gate% T_j + d_i <= T_i for j in FI(i)% P <= Pmax, A <= Amax% x >= 1%% where variables are x and T.% % We use the circuit topology presented in figure 1 (page 902),% where we take gates 1, 3 and 6 to be inverters (INV), % gates 2 and 7 to be three input NANDs (NAND3),% and gates 4 and 5 to be two input NORs (NOR2).%% Almir Mutapcic 01/26/06clear all; close all;PLOT_TRADEOFF = 1; % to disable plotting set PLOT_TRADEOFF = 0;%********************************************************************% user specified data (specify problem constant and ckt topology)%********************************************************************m = 7; % number of gatesVdd = 5; % supply voltageAmax = 250; % maximum area specPmax = 15; % maximum power spec% gate specsINV = struct('Cin',3, 'Cint',3, 'Rdrv',0.48, 'A',3, 'Ileak',0.006);NAND3 = struct('Cin',4, 'Cint',6, 'Rdrv',0.48, 'A',8, 'Ileak',0.007);NOR2 = struct('Cin',5, 'Cint',6, 'Rdrv',0.48, 'A',10, 'Ileak',0.009);gates([1 3 6]) = INV;gates([2 7]) = NAND3;gates([4 5]) = NOR2;% primary inputs and primary outputs labels (start with m+1)primary_inputs = [8 9 10];primary_outputs = [11 12];M = m + length( primary_inputs ) + length( primary_outputs );% fan-in cell arrayFI = cell(M,1);FI{1} = [8];FI{2} = [8 9 10];FI{3} = [10];FI{4} = [1 2];FI{5} = [2 3];FI{6} = [4];FI{7} = [3 4 5];FI{8} = [];FI{9} = [];FI{10} = [];FI{11} = [6];FI{12} = [7];% primary output has Cin capacitance (but has no Cload)Cin_po = sparse(M,1);Cin_po(primary_outputs) = [10 10];% primary input has Cload capacitance (but has no Cin)Cload_pi = sparse(M,1);Cload_pi(primary_inputs) = [10 10 10];% activity frequency of gates and primary inputsf_gates = 0.001*ones(m,1);f_pi = sparse(M,1);f_pi(primary_inputs) = 0.001*[10 10 10];%********************************************************************% derived problem data (computed from user inputs)%********************************************************************% fan-out cell array (compute it from the fan-in cell array)FO = cell(M,1);for gate = [1:m primary_outputs] preds = FI{gate}; for k = 1:length(preds) FO{preds(k)}(end+1) = gate; endend% input and internal capacitance of gates, and driving resistanceCin_norm = [gates.Cin]';Cint_norm = [gates.Cint]';Rdrv_norm = [gates.Rdrv]';% area specification for each gate with unit scalingA_norm = [gates.A]';% leakage current of gate i with unit scalingIleak_norm = [gates.Ileak]';%********************************************************************% optimization%********************************************************************% optimization variablesgpvar x(m) % scale factorgpvar T(m) % arrival times% input capacitance is an affine function of sizesCin = Cin_norm.*x;Cint = Cint_norm.*x;% driving resistance is inversily proportional to sizesR = Rdrv_norm./x;% gate delay is the product of its driving resistance and load cap.Cload = posynomial;for gate = 1:m if ~ismember( FO{gate}, primary_outputs ) Cload(gate) = sum( Cin(FO{gate}) ); else Cload(gate) = Cin_po( FO{gate} ); endendCload = Cload';% delayD = 0.69*ones(m,1).*R.*( Cint + Cload );% total areaarea = A_norm'*x;% total power calculationPdyn = Vdd^2*sum( f_pi(primary_inputs).*Cload_pi(primary_inputs) ) + ... Vdd^2*(f_gates'*(Cint + Cload));Pstat = Vdd*Ileak_norm'*x;power = Pdyn + Pstat;% constraintsx_constr = ones(m,1) <= x; % all sizes greater than 1 (normalized)% create timing constraintstiming_constr = [];for gate = 1:m if ~ismember( FI{gate}, primary_inputs ) for j = FI{gate} % enforce T_j + D_j <= T_i over all gates j that drive i timing_constr = [timing_constr; D(gate) + T(j) <= T(gate)]; end else % enforce D_i <= T_i for gates i connected to primary inputs timing_constr = [timing_constr; D(gate) <= T(gate)]; endend% objective is the upper bound on the overall delay % and that is the max of arrival times for output gatesoutput_gates = [FI{primary_outputs}]; D = max( T(output_gates) );% collect all the constraintsconstr = [area <= Amax; power <= Pmax; timing_constr; x_constr];% formulate the GP problem and solve it[obj_value, solution, status] = gpsolve(D, constr);assign(solution);ckt_delay_plot = obj_value;Pmax_plot = Pmax;fprintf(1,'\nOptimal circuit delay for Pmax = %d and Amax = %d is %3.4f.\n', ... Pmax, Amax, obj_value)disp('Optimal scale factors are: ')x%********************************************************************% tradeoff curve code%********************************************************************if( PLOT_TRADEOFF )% varying parameters for an optimal trade-off curveN = 25;Pmax = linspace(10,20,N);Amax = [250];min_delay = zeros(N,1);% set the quiet flag (no solver reporting)global QUIET; QUIET = 1;for n = 1:N % add constraints that have varying parameters constr(1) = area <= Amax(k); constr(2) = power <= Pmax(n); % solve the GP problem and compute the optimal volume [obj_value, solution, status] = gpsolve(D, constr); if strcmp(status,'Infeasible') error('Problem is infeasible.') end min_delay(n) = obj_value;end% enable solver reporting againglobal QUIET; QUIET = 0;% plot the tradeoff curveplot(Pmax,min_delay); hold onplot(Pmax_plot, ckt_delay_plot,'o'); hold off;xlabel('Pmax'); ylabel('Dmin');title(['Tradeoff curve for Amax = ' num2str(Amax)])end% end tradeoff curve code
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -