示例#1
0
文件: wire.cpp 项目: Hopobcn/cacti
Wire::Wire(double w_s, double s_s, enum Wire_placement wp, double resis, TechnologyParameter::DeviceType* dt) {
    w_scale = w_s;
    s_scale = s_s;
    deviceType = dt;
    wire_placement = wp;
    resistivity = resis;
    min_w_pmos = deviceType->n_to_p_eff_curr_drv_ratio * g_tp.min_w_nmos_;
    in_rise_time = 0;
    out_rise_time = 0;

    switch (wire_placement) {
    case outside_mat:
        wire_width = g_tp.wire_outside_mat.pitch;
        break;
    case inside_mat :
        wire_width = g_tp.wire_inside_mat.pitch;
        break;
    default:
        wire_width = g_tp.wire_local.pitch;
        break;
    }

    wire_spacing = wire_width;

    wire_width *= (w_scale * 1e-6 / 2) /* (m) */;
    wire_spacing *= (s_scale * 1e-6 / 2) /* (m) */;

    init_wire();

    wire_width_init = wire_width;
    wire_spacing_init = wire_spacing;

    assert(power.readOp.dynamic > 0);
    assert(power.readOp.leakage > 0);
}
示例#2
0
void
draw_wire(ModeInfo * mi)
{
	int         offset, i, j, found = 0;
	unsigned char *z, *znew;
	circuitstruct *wp;

	if (circuits == NULL)
		return;
	wp = &circuits[MI_SCREEN(mi)];
	if (wp->newcells == NULL)
		return;

	MI_IS_DRAWN(mi) = True;

	/* wires do not grow so min max stuff does not change */
	for (j = wp->minrow; j <= wp->maxrow; j++) {
		for (i = wp->mincol; i <= wp->maxcol; i++) {
			offset = j * wp->bncols + i;
			z = wp->oldcells + offset;
			znew = wp->newcells + offset;
			if (*z != *znew) {	/* Counting on once a space always a space */
				found = 1;
				*z = *znew;
				if (!addtolist(mi, i - 2, j - 2, *znew - 1)) {
					free_wire(MI_DISPLAY(mi), wp);
					return;
				}
			}
		}
	}
	for (i = 0; i < COLORS - 1; i++)
		if (!draw_state(mi, i)) {
			free_wire(MI_DISPLAY(mi), wp);
			return;
		}
	if (++wp->generation > MI_CYCLES(mi) || !found) {
		init_wire(mi);
		return;
	} else
		do_gen(wp);

	if (wp->redrawing) {
		for (i = 0; i < REDRAWSTEP; i++) {
			if ((*(wp->oldcells + wp->redrawpos))) {
				drawCell(mi, wp->redrawpos % wp->bncols - 2,
					 wp->redrawpos / wp->bncols - 2, *(wp->oldcells + wp->redrawpos) - 1);
			}
			if (++(wp->redrawpos) >= wp->bncols * (wp->bnrows - 2)) {
				wp->redrawing = 0;
				break;
			}
		}
	}
}