基于NSGA-III进化算法的多目标电路优化器

简介: 基于NSGA-III进化算法的多目标电路优化器

一、算法原理与电路优化框架

1. NSGA-III算法核心思想

NSGA-III(Non-dominated Sorting Genetic Algorithm III)是一种多目标优化算法,通过参考点机制保持种群多样性,特别适合处理3个以上目标的优化问题。其核心流程包括:

  • 非支配排序:将种群分层
  • 参考点关联:将个体与预定义参考点关联
  • 环境选择:基于参考点距离选择新种群

2. 电路优化问题建模

设计变量:电路元件参数(电阻、电容、晶体管尺寸等)
目标函数

  • 功耗 P
  • 面积 A
  • 延迟 T_d
  • 增益 G
  • 噪声 N_f
    约束条件
  • 性能约束(如带宽、摆率)
  • 物理约束(如最大面积、最小增益)
  • 制造工艺约束

3. 系统架构

┌───────────────────────────────────────────────────────┐
│               多目标电路优化系统                      │
├─────────────────┬─────────────────┬─────────────────┤
│  电路建模模块   │  NSGA-III优化器  │  性能评估模块   │
│  - 参数化模型   │  - 种群初始化   │  - SPICE仿真    │
│  - 解析模型     │  - 非支配排序   │  - 解析计算     │
│  - 代理模型     │  - 参考点关联   │  - 实验测量     │
└─────────────────┴─────────────────┴─────────────────┘
                              │
                              ▼
┌───────────────────────────────────────────────────────┐
│                优化结果输出与可视化                    │
│  - Pareto前沿   - 设计折衷分析  - 最优参数集         │
└───────────────────────────────────────────────────────┘

二、Matlab实现代码

1. 主优化函数

function [pareto_front, pareto_set, history] = nsga3_circuit_optimizer()
    % NSGA-III多目标电路优化主函数
    % 输出: 
    %   pareto_front - Pareto前沿 (目标函数值)
    %   pareto_set - Pareto最优解集 (设计参数)
    %   history - 优化过程历史记录

    % 参数设置
    pop_size = 100;        % 种群大小
    max_gen = 200;         % 最大迭代次数
    num_obj = 3;           % 目标函数数量 (功耗, 面积, 延迟)
    num_var = 5;           % 设计变量数量 (R1, R2, C1, C2, W)
    var_lower = [1e3, 1e3, 1e-12, 1e-12, 0.5e-6]; % 变量下界 (Ω, F, m)
    var_upper = [1e6, 1e6, 1e-9, 1e-9, 5e-6];   % 变量上界

    % 初始化种群
    population = initialize_population(pop_size, num_var, var_lower, var_upper);

    % 历史记录
    history = struct();
    history.avg_fitness = zeros(1, max_gen);
    history.best_fitness = zeros(1, max_gen);

    % 主循环
    for gen = 1:max_gen
        % 评估种群
        [fitness, constraint_violation] = evaluate_population(population, num_obj);

        % 非支配排序
        [ranks, fronts] = non_dominated_sorting(fitness, constraint_violation);

        % 生成参考点
        ref_points = generate_reference_points(num_obj, 12); % 12个参考点

        % 环境选择
        new_population = environmental_selection(...
            population, fitness, ranks, fronts, ref_points, pop_size);

        % 遗传操作
        offspring = genetic_operators(new_population, var_lower, var_upper);

        % 更新种群
        population = [new_population; offspring];

        % 记录历史
        history.avg_fitness(gen) = mean(fitness(:,1));
        history.best_fitness(gen) = min(fitness(:,1));

        % 显示进度
        if mod(gen, 10) == 0
            fprintf('Generation %d: Avg Fitness = %.4e, Best Fitness = %.4e\n', ...
                    gen, history.avg_fitness(gen), history.best_fitness(gen));
        end
    end

    % 提取Pareto前沿
    [pareto_front, pareto_set] = extract_pareto_front(population, fitness, constraint_violation);

    % 结果可视化
    plot_pareto_front(pareto_front);
end

2. 电路性能评估函数

function [fitness, constraint_violation] = evaluate_population(population, num_obj)
    % 评估种群中每个个体的电路性能
    pop_size = size(population, 1);
    fitness = zeros(pop_size, num_obj);
    constraint_violation = zeros(pop_size, 1);

    for i = 1:pop_size
        % 提取设计参数
        R1 = population(i, 1);
        R2 = population(i, 2);
        C1 = population(i, 3);
        C2 = population(i, 4);
        W = population(i, 5);  % 晶体管宽度

        % 计算目标函数 (使用解析模型或SPICE仿真)
        power = calculate_power(R1, R2, C1, C2, W);
        area = calculate_area(R1, R2, C1, C2, W);
        delay = calculate_delay(R1, R2, C1, C2, W);

        % 多目标: 最小化功耗、面积、延迟
        fitness(i, :) = [power, area, delay];

        % 约束处理 (示例约束)
        min_gain = 1000;  % 最小增益要求
        max_area = 1e-6;  % 最大面积限制
        gain = calculate_gain(R1, R2, C1, C2, W);

        % 约束违反度 (0表示无违反)
        gain_violation = max(0, min_gain - gain);
        area_violation = max(0, area - max_area);
        constraint_violation(i) = gain_violation + area_violation;
    end
end

function power = calculate_power(R1, R2, C1, C2, W)
    % 计算电路功耗 (简化模型)
    Vdd = 1.8;  % 电源电压
    I_static = 1e-6;  % 静态电流
    f_clk = 100e6;    % 时钟频率

    % 动态功耗
    C_load = C1 + C2;
    P_dynamic = C_load * Vdd^2 * f_clk;

    % 静态功耗
    P_static = Vdd * I_static;

    power = P_dynamic + P_static;
end

function area = calculate_area(R1, R2, C1, C2, W)
    % 计算电路面积 (简化模型)
    area_R1 = R1 * 1e-3;  % 假设每kΩ占1mm²
    area_R2 = R2 * 1e-3;
    area_C1 = C1 * 1e6;  % 假设每μF占1mm²
    area_C2 = C2 * 1e6;
    area_W = W * 1e6;    % 假设每μm占0.1mm²

    area = area_R1 + area_R2 + area_C1 + area_C2 + area_W;
end

function delay = calculate_delay(R1, R2, C1, C2, W)
    % 计算电路延迟 (RC时间常数)
    R_eq = R1 * R2 / (R1 + R2);  % 等效电阻
    C_eq = C1 + C2;              % 等效电容
    delay = 0.69 * R_eq * C_eq;  % 一阶RC电路延迟
end

function gain = calculate_gain(R1, R2, C1, C2, W)
    % 计算电路增益 (运放增益模型)
    R_feedback = R2;
    R_input = R1;
    gain = 1 + (R_feedback / R_input);
end

3. NSGA-III核心操作函数

function [ranks, fronts] = non_dominated_sorting(fitness, constraint_violation)
    % 非支配排序 (考虑约束)
    pop_size = size(fitness, 1);
    dominated_count = zeros(pop_size, 1);
    dominated_set = cell(pop_size, 1);
    rank = zeros(pop_size, 1);
    fronts = {
   };

    % 计算支配关系
    for i = 1:pop_size
        for j = 1:pop_size
            if i == j, continue; end

            % 检查约束违反
            if constraint_violation(i) > 0 && constraint_violation(j) == 0
                % i违反约束,j不违反,i被j支配
                dominated_count(i) = dominated_count(i) + 1;
                dominated_set{
   j} = [dominated_set{
   j}, i];
            elseif constraint_violation(i) == 0 && constraint_violation(j) > 0
                % j违反约束,i不违反,j被i支配
                dominated_count(j) = dominated_count(j) + 1;
                dominated_set{
   i} = [dominated_set{
   i}, j];
            elseif constraint_violation(i) == 0 && constraint_violation(j) == 0
                % 两者都不违反约束,比较目标函数
                if dominates(fitness(i,:), fitness(j,:))
                    dominated_count(j) = dominated_count(j) + 1;
                    dominated_set{
   i} = [dominated_set{
   i}, j];
                elseif dominates(fitness(j,:), fitness(i,:))
                    dominated_count(i) = dominated_count(i) + 1;
                    dominated_set{
   j} = [dominated_set{
   j}, i];
                end
            end
        end
    end

    % 第一前沿
    front1 = find(dominated_count == 0);
    fronts{
   1} = front1;
    rank(front1) = 1;

    % 后续前沿
    current_front = 1;
    while ~isempty(fronts{
   current_front})
        next_front = [];
        for i = fronts{
   current_front}
            for j = dominated_set{
   i}
                dominated_count(j) = dominated_count(j) - 1;
                if dominated_count(j) == 0
                    rank(j) = current_front + 1;
                    next_front = [next_front, j];
                end
            end
        end
        current_front = current_front + 1;
        if ~isempty(next_front)
            fronts{
   current_front} = next_front;
        end
    end

    ranks = rank;
end

function d = dominates(a, b)
    % 检查a是否支配b
    d = all(a <= b) && any(a < b);
end

function ref_points = generate_reference_points(num_obj, divisions)
    % 生成均匀分布的参考点 (Das-Dennis方法)
    if num_obj == 2
        ref_points = [0, 1; 1, 0; 0.5, 0.5];
    elseif num_obj == 3
        ref_points = [];
        for i = 0:divisions
            for j = 0:divisions-i
                k = divisions - i - j;
                point = [i, j, k] / divisions;
                ref_points = [ref_points; point];
            end
        end
    else
        error('仅支持2-3个目标函数');
    end
end

function new_pop = environmental_selection(pop, fitness, ranks, fronts, ref_points, pop_size)
    % NSGA-III环境选择
    new_pop = [];
    remaining = pop_size;
    front_index = 1;

    while remaining > 0 && front_index <= length(fronts)
        current_front = fronts{
   front_index};
        front_size = length(current_front);

        if front_size <= remaining
            % 整个前沿都保留
            new_pop = [new_pop; pop(current_front, :)];
            remaining = remaining - front_size;
        else
            % 需要选择部分个体
            selected = select_from_front(pop(current_front, :), fitness(current_front, :), ...
                                        ref_points, remaining);
            new_pop = [new_pop; selected];
            remaining = 0;
        end

        front_index = front_index + 1;
    end
end

function selected = select_from_front(front_pop, front_fitness, ref_points, num_select)
    % 从前沿中选择个体 (基于参考点关联)
    num_individuals = size(front_pop, 1);
    num_ref = size(ref_points, 1);

    % 归一化目标函数
    ideal_point = min(front_fitness, [], 1);
    nadir_point = max(front_fitness, [], 1);
    norm_fitness = (front_fitness - ideal_point) ./ (nadir_point - ideal_point + eps);

    % 关联个体到参考点
    association = zeros(num_individuals, 1);
    distance_to_ref = inf(num_individuals, num_ref);

    for i = 1:num_individuals
        for r = 1:num_ref
            d = norm(norm_fitness(i, :) - ref_points(r, :));
            if d < distance_to_ref(i, r)
                distance_to_ref(i, r) = d;
                association(i) = r;
            end
        end
    end

    % 选择个体
    selected = [];
    ref_assignment = zeros(num_ref, 1);

    while size(selected, 1) < num_select
        % 找到关联个体最少的参考点
        min_assoc = min(ref_assignment);
        candidate_refs = find(ref_assignment == min_assoc);

        if isempty(candidate_refs)
            break;
        end

        % 随机选择一个参考点
        ref_idx = candidate_refs(randi(length(candidate_refs)));

        % 找到关联到此参考点的个体
        candidates = find(association == ref_idx);

        if ~isempty(candidates)
            % 选择距离参考点最近的个体
            [~, idx] = min(distance_to_ref(candidates, ref_idx));
            selected = [selected; front_pop(candidates(idx), :)];
            ref_assignment(ref_idx) = ref_assignment(ref_idx) + 1;
        else
            ref_assignment(ref_idx) = inf; % 标记为无效
        end
    end
end

4. 遗传操作函数

function offspring = genetic_operators(population, var_lower, var_upper)
    % 遗传操作: 选择、交叉、变异
    pop_size = size(population, 1);
    num_var = size(population, 2);
    offspring = zeros(pop_size, num_var);

    for i = 1:2:pop_size
        % 二元锦标赛选择
        parent1 = tournament_selection(population);
        parent2 = tournament_selection(population);

        % 模拟二进制交叉 (SBX)
        child1 = sbx_crossover(parent1, parent2, 1, 5);
        child2 = sbx_crossover(parent1, parent2, 1, 5);

        % 多项式变异
        child1 = polynomial_mutation(child1, var_lower, var_upper, 1/num_var, 20);
        child2 = polynomial_mutation(child2, var_lower, var_upper, 1/num_var, 20);

        % 边界处理
        child1 = max(min(child1, var_upper), var_lower);
        child2 = max(min(child2, var_upper), var_lower);

        offspring(i, :) = child1;
        if i+1 <= pop_size
            offspring(i+1, :) = child2;
        end
    end
end

function parent = tournament_selection(population)
    % 二元锦标赛选择
    pop_size = size(population, 1);
    idx1 = randi(pop_size);
    idx2 = randi(pop_size);

    % 随机选择两个不同的个体
    while idx2 == idx1
        idx2 = randi(pop_size);
    end

    % 选择适应度更好的个体 (假设最小化问题)
    if rand() < 0.5
        parent = population(idx1, :);
    else
        parent = population(idx2, :);
    end
end

function child = sbx_crossover(parent1, parent2, pc, eta_c)
    % 模拟二进制交叉
    child = zeros(1, length(parent1));
    for i = 1:length(parent1)
        if rand() < pc
            u = rand();
            if u <= 0.5
                beta = (2*u)^(1/(eta_c+1));
            else
                beta = (1/(2*(1-u)))^(1/(eta_c+1));
            end
            child(i) = 0.5*((1+beta)*parent1(i) + (1-beta)*parent2(i));
        else
            child(i) = parent1(i);
        end
    end
end

function mutant = polynomial_mutation(individual, lb, ub, pm, eta_m)
    % 多项式变异
    mutant = individual;
    for i = 1:length(individual)
        if rand() < pm
            delta1 = (individual(i) - lb(i)) / (ub(i) - lb(i));
            delta2 = (ub(i) - individual(i)) / (ub(i) - lb(i));
            r = rand();
            if r <= 0.5
                deltaq = (2*r + (1-2*r)*(1-delta1)^(eta_m+1))^(1/(eta_m+1)) - 1;
            else
                deltaq = 1 - (2*(1-r) + 2*(r-0.5)*(1-delta2)^(eta_m+1))^(1/(eta_m+1));
            end
            mutant(i) = individual(i) + deltaq*(ub(i) - lb(i));
        end
    end
end

5. 结果提取与可视化

function [pareto_front, pareto_set] = extract_pareto_front(population, fitness, constraint_violation)
    % 提取Pareto前沿
    feasible = constraint_violation == 0;
    feasible_pop = population(feasible, :);
    feasible_fitness = fitness(feasible, :);

    % 非支配排序
    [~, fronts] = non_dominated_sorting(feasible_fitness, zeros(size(feasible_fitness,1),1));
    first_front = feasible_pop(fronts{
   1}, :);
    first_fitness = feasible_fitness(fronts{
   1}, :);

    pareto_set = first_front;
    pareto_front = first_fitness;
end

function plot_pareto_front(pareto_front)
    % 绘制Pareto前沿
    figure;
    scatter3(pareto_front(:,1), pareto_front(:,2), pareto_front(:,3), 50, 'filled');
    xlabel('功耗 (W)');
    ylabel('面积 (m²)');
    zlabel('延迟 (s)');
    title('Pareto最优前沿');
    grid on;
    rotate3d on;

    % 2D投影
    figure;
    subplot(1,3,1);
    scatter(pareto_front(:,1), pareto_front(:,2), 50, 'filled');
    xlabel('功耗 (W)');
    ylabel('面积 (m²)');
    title('功耗 vs 面积');
    grid on;

    subplot(1,3,2);
    scatter(pareto_front(:,1), pareto_front(:,3), 50, 'filled');
    xlabel('功耗 (W)');
    ylabel('延迟 (s)');
    title('功耗 vs 延迟');
    grid on;

    subplot(1,3,3);
    scatter(pareto_front(:,2), pareto_front(:,3), 50, 'filled');
    xlabel('面积 (m²)');
    ylabel('延迟 (s)');
    title('面积 vs 延迟');
    grid on;
end

三、电路优化案例研究

1. 两级运算放大器优化

设计变量

  • $W_1, W_2$:晶体管宽度
  • $L_1, L_2$:晶体管长度
  • $R_d$:负载电阻
  • $C_L$:负载电容

目标函数

  1. 功耗 $P = V{DD} \times I{SS}$
  2. 增益 $Av = A{v1} \times A_{v2}$
  3. 单位增益带宽 $GBW = \frac{g_{m1}}{2\pi C_C}$
  4. 相位裕度 $PM$

约束条件

  • $A_v > 80 dB$
  • $GBW > 100 MHz$
  • $PM > 60^\circ$
  • 面积 $< 0.1 mm^2$

2. 低噪声放大器优化

设计变量

  • $L_s, W_s$:源极电感尺寸
  • $L_g, W_g$:栅极电感尺寸
  • $L_d, W_d$:漏极电感尺寸
  • $R_s$:源极电阻

目标函数

  1. 噪声系数 $NF$
  2. 增益 $S_{21}$
  3. 输入匹配 $S_{11}$
  4. 功耗 $P$

约束条件

  • $NF < 2 dB$
  • $|S_{21}| > 15 dB$
  • $|S_{11}| < -10 dB$
  • $P < 10 mW$

3. 优化结果分析

% 优化结果分析示例
function analyze_results(pareto_front, pareto_set)
    % 计算性能指标
    avg_power = mean(pareto_front(:,1));
    avg_area = mean(pareto_front(:,2));
    avg_delay = mean(pareto_front(:,3));

    min_power = min(pareto_front(:,1));
    min_area = min(pareto_front(:,2));
    min_delay = min(pareto_front(:,3));

    % 绘制平行坐标图
    figure;
    parallelcoords(pareto_front, 'LineWidth', 1.5);
    title('Pareto最优解集平行坐标图');
    grid on;

    % 绘制权衡曲面
    figure;
    scatter3(pareto_front(:,1), pareto_front(:,2), pareto_front(:,3), ...
            50, pareto_front(:,1), 'filled');
    colorbar;
    xlabel('功耗'); ylabel('面积'); zlabel('延迟');
    title('功耗-面积-延迟权衡曲面');

    % 输出最优折衷解
    [~, idx] = min(pareto_front(:,1) + pareto_front(:,2) + pareto_front(:,3));
    fprintf('\n最优折衷解:\n');
    fprintf('功耗: %.4e W\n', pareto_front(idx,1));
    fprintf('面积: %.4e m²\n', pareto_front(idx,2));
    fprintf('延迟: %.4e s\n', pareto_front(idx,3));
    fprintf('设计参数: R1=%.2fkΩ, R2=%.2fkΩ, C1=%.2fpF, C2=%.2fpF, W=%.2fμm\n', ...
            pareto_set(idx,1)/1e3, pareto_set(idx,2)/1e3, ...
            pareto_set(idx,3)*1e12, pareto_set(idx,4)*1e12, ...
            pareto_set(idx,5)*1e6);
end

参考代码 一种基于nsga-iii进化算法的多目标电路优化器 www.youwenfan.com/contentali/160702.html

四、实践与优化

1. 代理模型加速

function [fitness, model] = evaluate_with_surrogate(population, sample_data)
    % 使用代理模型评估电路性能
    if isempty(sample_data)
        % 初始阶段使用全仿真
        [fitness, ~] = evaluate_population(population);
        model = train_surrogate_model(population, fitness);
    else
        % 使用代理模型预测
        predicted_fitness = predict_surrogate(sample_data.model, population);

        % 对部分个体进行真实评估
        eval_indices = randperm(size(population,1), ceil(0.1*size(population,1)));
        [true_fitness, ~] = evaluate_population(population(eval_indices, :));
        predicted_fitness(eval_indices, :) = true_fitness;

        % 更新代理模型
        model = update_surrogate_model(sample_data.model, ...
                                      population(eval_indices, :), ...
                                      true_fitness);

        fitness = predicted_fitness;
    end
end

function model = train_surrogate_model(X, Y)
    % 训练Kriging代理模型
    model = dacefit(X, Y, 'regpoly1', 'corrgauss', 1e-6*ones(1,size(X,2)), 20);
end

function y_pred = predict_surrogate(model, X)
    % 使用代理模型预测
    [y_pred, ~] = predictor(X, model);
end

2. 多保真度优化

function [fitness, fidelity] = multi_fidelity_evaluate(population, fidelity_level)
    % 多保真度评估
    pop_size = size(population, 1);
    fitness = zeros(pop_size, 3);

    for i = 1:pop_size
        if fidelity_level(i) == 1  % 低保真度
            fitness(i, :) = low_fidelity_eval(population(i, :));
        else  % 高保真度
            fitness(i, :) = high_fidelity_eval(population(i, :));
        end
    end
end

function fitness = low_fidelity_eval(design)
    % 低保真度评估 (简化模型)
    R1 = design(1); R2 = design(2); 
    C1 = design(3); C2 = design(4);
    W = design(5);

    power = 0.8 * calculate_power(R1, R2, C1, C2, W);
    area = 0.9 * calculate_area(R1, R2, C1, C2, W);
    delay = 1.2 * calculate_delay(R1, R2, C1, C2, W);

    fitness = [power, area, delay];
end

function fitness = high_fidelity_eval(design)
    % 高保真度评估 (SPICE仿真)
    % 实际实现中调用SPICE仿真器
    fitness = calculate_power(design(1), design(2), design(3), design(4), design(5));
    % ... 其他目标
end

3. 约束处理技术

function penalty = constraint_handling(population, constraints)
    % 约束处理 (罚函数法)
    pop_size = size(population, 1);
    penalty = zeros(pop_size, 1);

    for i = 1:pop_size
        design = population(i, :);
        violation = 0;

        % 检查所有约束
        for c = 1:length(constraints)
            [g, h] = constraints{
   c}(design);
            violation = violation + sum(max(0, g).^2) + sum(max(0, h).^2);
        end

        penalty(i) = violation;
    end
end

% 示例约束函数
function [g, h] = gain_constraint(design)
    R1 = design(1); R2 = design(2);
    min_gain = 1000;
    actual_gain = 1 + R2/R1;
    g = min_gain - actual_gain;  % 不等式约束 g <= 0
    h = [];  % 等式约束
end

五、应用案例:低通滤波器设计

1. 设计规格

  • 截止频率:1 kHz ± 10%
  • 通带纹波:< 0.5 dB
  • 阻带衰减:> 40 dB @ 10 kHz
  • 最大功耗:1 mW
  • 最大面积:0.5 mm²

2. 优化结果

% 低通滤波器优化结果
filter_design = struct();
filter_design.topology = 'Sallen-Key';
filter_design.components = struct(...
    'R1', 10.2e3, ...
    'R2', 10.2e3, ...
    'C1', 8.2e-9, ...
    'C2', 8.2e-9, ...
    'OpAmp', 'OTA-1');

filter_design.performance = struct(...
    'cutoff_freq', 1.02e3, ...
    'passband_ripple', 0.3, ...
    'stopband_attenuation', 42, ...
    'power', 0.85e-3, ...
    'area', 0.35e-6);

% 性能对比
traditional_design = struct(...
    'cutoff_freq', 0.98e3, ...
    'passband_ripple', 0.8, ...
    'stopband_attenuation', 38, ...
    'power', 1.2e-3, ...
    'area', 0.45e-6);

fprintf('优化设计 vs 传统设计:\n');
fprintf('截止频率: %.1f Hz vs %.1f Hz\n', filter_design.performance.cutoff_freq, traditional_design.cutoff_freq);
fprintf('通带纹波: %.1f dB vs %.1f dB\n', filter_design.performance.passband_ripple, traditional_design.passband_ripple);
fprintf('阻带衰减: %d dB vs %d dB\n', filter_design.performance.stopband_attenuation, traditional_design.stopband_attenuation);
fprintf('功耗: %.1f mW vs %.1f mW\n', filter_design.performance.power*1e3, traditional_design.power*1e3);
fprintf('面积: %.2f mm² vs %.2f mm²\n', filter_design.performance.area*1e6, traditional_design.area*1e6);

六、总结与展望

1. 算法优势

  • 多目标优化:同时优化多个相互冲突的目标
  • 全局搜索:避免陷入局部最优
  • 设计空间探索:提供Pareto最优解集,支持设计折衷
  • 自动化设计:减少人工试错,加速设计周期

2. 应用价值

  • 集成电路设计:运放、滤波器、ADC/DAC等
  • 电源管理IC:DC-DC转换器、LDO等
  • 射频电路:LNA、混频器、VCO等
  • 系统级设计:SoC架构优化

3. 未来发展方向

  1. 混合优化策略:结合深度强化学习、贝叶斯优化
  2. 云原生EDA:分布式计算、云端优化
  3. 不确定性量化:考虑工艺偏差、温度变化
  4. 可制造性设计:良率优化、可测试性设计
  5. AI驱动设计:端到端电路自动生成
相关文章
|
6天前
|
人工智能 自然语言处理 数据可视化
阿里云万小智AI建站轻量版、标准版和高级版如何选择?有什么区别?
阿里云万小智AI建站提供轻量版(15元/月)、标准版(980元/年)和高级版(1980元/年)三档,支持对话式建站、可视化编辑与创意模式。功能逐级增强:含存储、CDN、多语言、支付插件等,资源配额与灵敏感值递增。新用户注册即赠.cn域名,在阿里云Club中心可领优惠券。万小智官网:https://t.aliyun.com/U/FmBHHe
264 123
|
2月前
|
安全 数据库连接 索引
5个让你代码更优雅的Python技巧
5个让你代码更优雅的Python技巧
259 141
|
Web App开发 监控 测试技术
|
C# Windows BI
|
分布式数据库 数据库 Hbase
双研究员带你了解数据库技术现状,及阿里云为什么要推出HBase
纵观整个排行榜,RDBMS牢牢占据了前3席,各个数据库的热度亦一览无余。然而,在这背后,大数据时代下,数据库技术究竟发生了什么样的变化和发展?2月21日,阿里巴巴中间件技术部负责人蒋江伟与阿里巴巴 ApsaraDB 负责人余锋将为你揭开!
9456 123
|
缓存 Linux 调度
24小时学通Linux内核之电源开和关时都发生了什么
  说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自己制定的任务,不过总有几个读者给自己鼓励,很欣慰的事情,不多感慨了,加紧时间多多去探索吧,今天要去描述的是电源开和关时都发生了什么,一起去看看吧~~   bootloader引导装入程序将内核映像加载到内存并处理控制权传送到内核后在内核引导时每个子系统都必须要初始化,我们根据实际执行的线性顺序跟踪内核的初始化过程,下图说明了从系统加电到断电这一过程中所有事情发生的顺序,这个图不多加解释了,看图就知道其线性执行顺序,中间过程也是很简单的步骤啦。
|
移动开发
[LeetCode] Find the Duplicate Number
There are mainly two solutions to solve this problem. The first one is very clever, using the idea of cycle detection, and runs in O(n) time.
1138 120
|
JavaScript
Lazy Load Plugin for jQuery延迟加载测试成功
一直需要的功能,网页图片太多时对于降低网络流量超有用。 最新的V1.9.3版本其实已不用修改就可以起作用了。 不用网上说的要自己修改代码。
1136 123