TME2 MOCCA - clicker le plus cher
This commit is contained in:
parent
ea656d61b3
commit
ce9a8ea707
Binary file not shown.
After Width: | Height: | Size: 68 KiB |
|
@ -0,0 +1,101 @@
|
||||||
|
include help.mk
|
||||||
|
|
||||||
|
ALLIANCE=/users/outil/alliance/alliance/Linux.el7_64/install
|
||||||
|
CMOS = $(ALLIANCE)/etc/cmos.rds
|
||||||
|
S130 = sky130_lsx.rds
|
||||||
|
SLIB = $(ALLIANCE)/cells/sxlib
|
||||||
|
PLIB = $(ALLIANCE)/cells/pxlib
|
||||||
|
|
||||||
|
VASY = export MBK_WORK_LIB=.; vasy
|
||||||
|
XPAT = export MBK_WORK_LIB=.; xpat
|
||||||
|
ASIM = export MBK_WORK_LIB=.; MBK_CATA_LIB=$(SLIB); asimut
|
||||||
|
BOOM = export MBK_WORK_LIB=.; boom
|
||||||
|
BOOG = export MBK_WORK_LIB=. MBK_TARGET_LIB=$(SLIB); MBK_OUT_LO=vst; boog
|
||||||
|
XSCH = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB); xsch
|
||||||
|
PLACE= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB); ocp
|
||||||
|
ROUTE= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB); nero
|
||||||
|
RING = export MBK_WORK_LIB=. MBK_CATA_LIB=$(PLIB); ring
|
||||||
|
GRAAL= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB); graal
|
||||||
|
DRUC = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(CMOS); druc
|
||||||
|
DREAL= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(S130); dreal
|
||||||
|
S2R = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(S130); s2r
|
||||||
|
EXTC = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(CMOS) MBK_OUT_LO=vst;\
|
||||||
|
cougar -c
|
||||||
|
EXTT = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(CMOS) MBK_OUT_LO=spi;\
|
||||||
|
cougar -t
|
||||||
|
|
||||||
|
#% Configuration
|
||||||
|
|
||||||
|
MODEL ?= clicker#% Nom du modèle à créer
|
||||||
|
VERBOSE ?= 0
|
||||||
|
|
||||||
|
## Tout en une fois
|
||||||
|
|
||||||
|
all: s2r ## Lance toutes les étapes de conceptions
|
||||||
|
|
||||||
|
## Etapes
|
||||||
|
|
||||||
|
## > validation
|
||||||
|
|
||||||
|
vasy: ## Genere le vbe à partir du vhd
|
||||||
|
$(VASY) -a -I vhd -p -o $(MODEL) $(MODEL)_v
|
||||||
|
|
||||||
|
simul_pat: vasy ## Simule un jeu de patterns écrit à la main
|
||||||
|
$(ASIM) -b $(MODEL)_v patterns/$(MODEL) $(MODEL)_res
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_res; fi
|
||||||
|
|
||||||
|
simul_gpat: vasy ## Simule un jeu de patterns générés
|
||||||
|
export MODEL=$(MODEL) CYCLES=50 TYPE=BEH; genpat patterns/$(MODEL)
|
||||||
|
$(ASIM) -b $(MODEL)_v $(MODEL)_gen $(MODEL)_gres
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_gres; fi
|
||||||
|
|
||||||
|
## > Synthèse
|
||||||
|
|
||||||
|
synth: simul_pat ## Synthétise pour produire la netlist de porte
|
||||||
|
$(BOOM) $(MODEL)_v $(MODEL)_o
|
||||||
|
$(BOOG) $(MODEL)_o $(MODEL)_o
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $$(XSCH) -l $(MODEL)_o; fi
|
||||||
|
|
||||||
|
place: synth ## Place les cellules du core
|
||||||
|
$(PLACE) -margin 0.3 -mdl 10 -ring $(MODEL)_o $(MODEL)_p
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(GRAAL) -l $(MODEL)_p; fi
|
||||||
|
|
||||||
|
route: place ## Route le core
|
||||||
|
$(ROUTE) -p $(MODEL)_p $(MODEL)_o $(MODEL)_o
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(GRAAL) -l $(MODEL)_o; fi
|
||||||
|
|
||||||
|
ring: route ## Route le core et les plots
|
||||||
|
cpp $(MODEL).h -DCORE=$(MODEL)_o | grep -v "^#" > $(MODEL)_chip.vst
|
||||||
|
cpp $(MODEL).h -DPLOT | grep -v "^#" > $(MODEL)_chip.rin
|
||||||
|
$(RING) $(MODEL)_chip $(MODEL)_chip
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(GRAAL) -l $(MODEL)_chip; fi
|
||||||
|
|
||||||
|
s2r: druc ## Génère le format CIF
|
||||||
|
$(S2R) -tv $(MODEL)_chip
|
||||||
|
$(DREAL) -l $(MODEL)_chip
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(DREAL) -l $(MODEL)_chip; fi
|
||||||
|
|
||||||
|
## > Vérification
|
||||||
|
|
||||||
|
druc: ring ## Vérifie les règles de dessin de tous le circuit
|
||||||
|
$(DRUC) $(MODEL)_o
|
||||||
|
|
||||||
|
cougar_cell: s2r ## Extraction du coeur jusqu'aux cellules
|
||||||
|
$(EXTC) -c $(MODEL)_o $(MODEL)_x
|
||||||
|
|
||||||
|
cougar_tran: s2r ## Extraction du coeur jusqu'aux transistors
|
||||||
|
$(EXTT) -t $(MODEL)_o $(MODEL)_x
|
||||||
|
|
||||||
|
resimul_pat: cougar_cell ## Simule un jeu de patterns générés
|
||||||
|
$(ASIM) -zd $(MODEL)_x patterns/$(MODEL)x $(MODEL)_resx
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_resx; fi
|
||||||
|
|
||||||
|
resimul_gpat: cougar_cell ## Simule un jeu de patterns générés
|
||||||
|
export MODEL=$(MODEL) CYCLES=50 TYPE=NET; genpat patterns/$(MODEL)
|
||||||
|
$(ASIM) -zd $(MODEL)_x $(MODEL)_genx $(MODEL)_gresx
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_gresx; fi
|
||||||
|
|
||||||
|
## Divers
|
||||||
|
|
||||||
|
clean: ## Efface tous les fichiers intermédiaires
|
||||||
|
rm -f $(MODEL)_*.* Makefile.*
|
|
@ -0,0 +1,101 @@
|
||||||
|
include help.mk
|
||||||
|
|
||||||
|
ALLIANCE=/users/outil/alliance/alliance/Linux.el7_64/install
|
||||||
|
CMOS = $(ALLIANCE)/etc/cmos.rds
|
||||||
|
S130 = sky130_lsx.rds
|
||||||
|
SLIB = $(ALLIANCE)/cells/sxlib
|
||||||
|
PLIB = $(ALLIANCE)/cells/pxlib
|
||||||
|
|
||||||
|
VASY = export MBK_WORK_LIB=.; vasy
|
||||||
|
XPAT = export MBK_WORK_LIB=.; xpat
|
||||||
|
ASIM = export MBK_WORK_LIB=.; MBK_CATA_LIB=$(SLIB); asimut
|
||||||
|
BOOM = export MBK_WORK_LIB=.; boom
|
||||||
|
BOOG = export MBK_WORK_LIB=. MBK_TARGET_LIB=$(SLIB); MBK_OUT_LO=vst; boog
|
||||||
|
XSCH = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB); xsch
|
||||||
|
PLACE= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB); ocp
|
||||||
|
ROUTE= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB); nero
|
||||||
|
RING = export MBK_WORK_LIB=. MBK_CATA_LIB=$(PLIB); ring
|
||||||
|
GRAAL= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB); graal
|
||||||
|
DRUC = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(CMOS); druc
|
||||||
|
DREAL= export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(S130); dreal
|
||||||
|
S2R = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(S130); s2r
|
||||||
|
EXTC = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(CMOS) MBK_OUT_LO=vst;\
|
||||||
|
cougar -c
|
||||||
|
EXTT = export MBK_WORK_LIB=. MBK_CATA_LIB=$(SLIB):$(PLIB) RDS_TECHNO_NAME=$(CMOS) MBK_OUT_LO=spi;\
|
||||||
|
cougar -t
|
||||||
|
|
||||||
|
#% Configuration
|
||||||
|
|
||||||
|
MODEL ?= clicker#% Nom du modèle à créer
|
||||||
|
VERBOSE ?= 0
|
||||||
|
|
||||||
|
## Tout en une fois
|
||||||
|
|
||||||
|
all: s2r ## Lance toutes les étapes de conceptions
|
||||||
|
|
||||||
|
## Etapes
|
||||||
|
|
||||||
|
## > validation
|
||||||
|
|
||||||
|
vasy: ## Genere le vbe à partir du vhd
|
||||||
|
$(VASY) -a -I vhd -p -o $(MODEL) $(MODEL)_v
|
||||||
|
|
||||||
|
simul_pat: vasy ## Simule un jeu de patterns écrit à la main
|
||||||
|
$(ASIM) -b $(MODEL)_v patterns/$(MODEL) $(MODEL)_res
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_res; fi
|
||||||
|
|
||||||
|
simul_gpat: vasy ## Simule un jeu de patterns générés
|
||||||
|
export MODEL=$(MODEL) CYCLES=50 TYPE=BEH; genpat patterns/$(MODEL)
|
||||||
|
$(ASIM) -b $(MODEL)_v $(MODEL)_gen $(MODEL)_gres
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_gres; fi
|
||||||
|
|
||||||
|
## > Synthèse
|
||||||
|
|
||||||
|
synth: simul_gpat ## Synthétise pour produire la netlist de porte, utilise gpat pour la convénience
|
||||||
|
$(BOOM) $(MODEL)_v $(MODEL)_o
|
||||||
|
$(BOOG) $(MODEL)_o $(MODEL)_o
|
||||||
|
#@if [[ "$(VERBOSE)" == "1" ]]; then $(XSCH) -l $(MODEL)_o; fi
|
||||||
|
|
||||||
|
place: synth ## Place les cellules du core
|
||||||
|
$(PLACE) -margin 0.3 -mdl 10 -ring $(MODEL)_o $(MODEL)_p
|
||||||
|
#@if [[ "$(VERBOSE)" == "1" ]]; then $(GRAAL) -l $(MODEL)_p; fi
|
||||||
|
|
||||||
|
route: place ## Route le core
|
||||||
|
$(ROUTE) -p $(MODEL)_p $(MODEL)_o $(MODEL)_o
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(GRAAL) -l $(MODEL)_o; fi
|
||||||
|
|
||||||
|
ring: route ## Route le core et les plots
|
||||||
|
cpp $(MODEL).h -DCORE=$(MODEL)_o | grep -v "^#" > $(MODEL)_chip.vst
|
||||||
|
cpp $(MODEL).h -DPLOT | grep -v "^#" > $(MODEL)_chip.rin
|
||||||
|
$(RING) $(MODEL)_chip $(MODEL)_chip
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(GRAAL) -l $(MODEL)_chip; fi
|
||||||
|
|
||||||
|
s2r: druc ## Génère le format CIF
|
||||||
|
$(S2R) -tv $(MODEL)_chip
|
||||||
|
$(DREAL) -l $(MODEL)_chip
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(DREAL) -l $(MODEL)_chip; fi
|
||||||
|
|
||||||
|
## > Vérification
|
||||||
|
|
||||||
|
druc: ring ## Vérifie les règles de dessin de tous le circuit
|
||||||
|
$(DRUC) $(MODEL)_o
|
||||||
|
|
||||||
|
cougar_cell: s2r ## Extraction du coeur jusqu'aux cellules
|
||||||
|
$(EXTC) -c $(MODEL)_o $(MODEL)_x
|
||||||
|
|
||||||
|
cougar_tran: s2r ## Extraction du coeur jusqu'aux transistors
|
||||||
|
$(EXTT) -t $(MODEL)_o $(MODEL)_x
|
||||||
|
|
||||||
|
resimul_pat: cougar_cell ## Simule un jeu de patterns générés
|
||||||
|
$(ASIM) -zd $(MODEL)_x patterns/$(MODEL)x $(MODEL)_resx
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_resx; fi
|
||||||
|
|
||||||
|
resimul_gpat: cougar_cell ## Simule un jeu de patterns générés
|
||||||
|
export MODEL=$(MODEL) CYCLES=50 TYPE=NET; genpat patterns/$(MODEL)
|
||||||
|
$(ASIM) -zd $(MODEL)_x $(MODEL)_genx $(MODEL)_gresx
|
||||||
|
@if [[ "$(VERBOSE)" == "1" ]]; then $(XPAT) -l $(MODEL)_gresx; fi
|
||||||
|
|
||||||
|
## Divers
|
||||||
|
|
||||||
|
clean: ## Efface tous les fichiers intermédiaires
|
||||||
|
rm -f $(MODEL)_*.* Makefile.*
|
|
@ -0,0 +1,111 @@
|
||||||
|
#define POWER_PORT ck,vdde,vddi,vsse,vssi : in bit
|
||||||
|
#define POWER ck=>ck_p,vdde=>vdde,vddi=>vddi,vsse=>vsse,vssi=>vssi
|
||||||
|
|
||||||
|
#ifdef PLOT
|
||||||
|
|
||||||
|
east ( p_vddi p_vssi p_vdde p_vsse )
|
||||||
|
west ( p_led1_0 p_led1_1 p_led1_2 p_led1_3 p_led1_4 p_led1_5 p_led1_6 p_raz p_led0_0 p_led0_1 )
|
||||||
|
north ( p_led2_0 p_led2_1 p_led2_2 p_led2_3 p_led2_4 p_led2_5 p_led2_6 p_plus p_led0_2 p_led0_3 )
|
||||||
|
south ( p_led3_0 p_led3_1 p_led3_2 p_led3_3 p_led3_4 p_led3_5 p_led3_6 p_ck p_led0_4 p_led0_5 p_led0_6 )
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
ENTITY clicker_chip IS
|
||||||
|
PORT (
|
||||||
|
ck : IN bit;
|
||||||
|
raz : IN bit;
|
||||||
|
plus : IN bit;
|
||||||
|
led0 : OUT bit_vector (0 to 6);
|
||||||
|
led1 : OUT bit_vector (0 to 6);
|
||||||
|
led2 : OUT bit_vector (0 to 6);
|
||||||
|
led3 : OUT bit_vector (0 to 6);
|
||||||
|
vddi, vssi : IN bit;
|
||||||
|
vdde, vsse : IN bit
|
||||||
|
);
|
||||||
|
END clicker_chip;
|
||||||
|
|
||||||
|
ARCHITECTURE chip OF clicker_chip IS
|
||||||
|
|
||||||
|
component pi_sp port ( pad : in bit; t : out bit; POWER_PORT ); end component;
|
||||||
|
component po_sp port ( i : in bit; pad : out bit; POWER_PORT ); end component;
|
||||||
|
component pvdde_sp port ( POWER_PORT ); end component;
|
||||||
|
component pvsse_sp port ( POWER_PORT ); end component;
|
||||||
|
component pvddi_sp port ( POWER_PORT ); end component;
|
||||||
|
component pvssi_sp port ( POWER_PORT ); end component;
|
||||||
|
|
||||||
|
component CORE port(
|
||||||
|
ck : IN bit;
|
||||||
|
raz : IN bit;
|
||||||
|
plus : IN bit;
|
||||||
|
led0 : OUT bit_vector (0 to 6);
|
||||||
|
led1 : OUT bit_vector (0 to 6);
|
||||||
|
led2 : OUT bit_vector (0 to 6);
|
||||||
|
led3 : OUT bit_vector (0 to 6);
|
||||||
|
vdd, vss : IN bit
|
||||||
|
);
|
||||||
|
END component;
|
||||||
|
|
||||||
|
signal ck_i, raz_i, ck_p, plus_i : bit;
|
||||||
|
signal led0_i : bit_vector(0 to 6);
|
||||||
|
signal led1_i : bit_vector(0 to 6);
|
||||||
|
signal led2_i : bit_vector(0 to 6);
|
||||||
|
signal led3_i : bit_vector(0 to 6);
|
||||||
|
|
||||||
|
begin
|
||||||
|
|
||||||
|
p_ck : pi_sp port map ( pad=>ck, t=>ck_i, POWER );
|
||||||
|
p_raz : pi_sp port map ( pad=>raz, t=>raz_i, POWER );
|
||||||
|
p_plus : pi_sp port map ( pad=>plus, t=>plus_i, POWER );
|
||||||
|
|
||||||
|
p_led0_0 : pi_sp port map ( pad=>led0(0), t=>led0_i(0), POWER );
|
||||||
|
p_led0_1 : pi_sp port map ( pad=>led0(1), t=>led0_i(1), POWER );
|
||||||
|
p_led0_2 : pi_sp port map ( pad=>led0(2), t=>led0_i(2), POWER );
|
||||||
|
p_led0_3 : pi_sp port map ( pad=>led0(3), t=>led0_i(3), POWER );
|
||||||
|
p_led0_4 : pi_sp port map ( pad=>led0(4), t=>led0_i(4), POWER );
|
||||||
|
p_led0_5 : pi_sp port map ( pad=>led0(5), t=>led0_i(5), POWER );
|
||||||
|
p_led0_6 : pi_sp port map ( pad=>led0(6), t=>led0_i(6), POWER );
|
||||||
|
|
||||||
|
p_led1_0 : pi_sp port map ( pad=>led1(0), t=>led1_i(0), POWER );
|
||||||
|
p_led1_1 : pi_sp port map ( pad=>led1(1), t=>led1_i(1), POWER );
|
||||||
|
p_led1_2 : pi_sp port map ( pad=>led1(2), t=>led1_i(2), POWER );
|
||||||
|
p_led1_3 : pi_sp port map ( pad=>led1(3), t=>led1_i(3), POWER );
|
||||||
|
p_led1_4 : pi_sp port map ( pad=>led1(4), t=>led1_i(4), POWER );
|
||||||
|
p_led1_5 : pi_sp port map ( pad=>led1(5), t=>led1_i(5), POWER );
|
||||||
|
p_led1_6 : pi_sp port map ( pad=>led1(6), t=>led1_i(6), POWER );
|
||||||
|
|
||||||
|
p_led2_0 : pi_sp port map ( pad=>led2(0), t=>led2_i(0), POWER );
|
||||||
|
p_led2_1 : pi_sp port map ( pad=>led2(1), t=>led2_i(1), POWER );
|
||||||
|
p_led2_2 : pi_sp port map ( pad=>led2(2), t=>led2_i(2), POWER );
|
||||||
|
p_led2_3 : pi_sp port map ( pad=>led2(3), t=>led2_i(3), POWER );
|
||||||
|
p_led2_4 : pi_sp port map ( pad=>led2(4), t=>led2_i(4), POWER );
|
||||||
|
p_led2_5 : pi_sp port map ( pad=>led2(5), t=>led2_i(5), POWER );
|
||||||
|
p_led2_6 : pi_sp port map ( pad=>led2(6), t=>led2_i(6), POWER );
|
||||||
|
|
||||||
|
p_led3_0 : pi_sp port map ( pad=>led3(0), t=>led3_i(0), POWER );
|
||||||
|
p_led3_1 : pi_sp port map ( pad=>led3(1), t=>led3_i(1), POWER );
|
||||||
|
p_led3_2 : pi_sp port map ( pad=>led3(2), t=>led3_i(2), POWER );
|
||||||
|
p_led3_3 : pi_sp port map ( pad=>led3(3), t=>led3_i(3), POWER );
|
||||||
|
p_led3_4 : pi_sp port map ( pad=>led3(4), t=>led3_i(4), POWER );
|
||||||
|
p_led3_5 : pi_sp port map ( pad=>led3(5), t=>led3_i(5), POWER );
|
||||||
|
p_led3_6 : pi_sp port map ( pad=>led3(6), t=>led3_i(6), POWER );
|
||||||
|
|
||||||
|
p_vdde : pvdde_sp port map ( POWER );
|
||||||
|
p_vsse : pvsse_sp port map ( POWER );
|
||||||
|
p_vddi : pvddi_sp port map ( POWER );
|
||||||
|
p_vssi : pvssi_sp port map ( POWER );
|
||||||
|
|
||||||
|
clicker : CORE port map (
|
||||||
|
ck => ck_i,
|
||||||
|
raz => raz_i,
|
||||||
|
plus => plus_i,
|
||||||
|
led0 => led0_i(0 to 6),
|
||||||
|
led1 => led1_i(0 to 6),
|
||||||
|
led2 => led2_i(0 to 6),
|
||||||
|
led3 => led3_i(0 to 6),
|
||||||
|
vdd => vddi,
|
||||||
|
vss => vssi
|
||||||
|
);
|
||||||
|
|
||||||
|
END chip;
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,94 @@
|
||||||
|
ENTITY clicker IS
|
||||||
|
PORT(
|
||||||
|
ck : IN std_logic;
|
||||||
|
plus : IN std_logic;
|
||||||
|
raz : IN std_logic;
|
||||||
|
led0 : OUT std_logic_vector (0 to 6);
|
||||||
|
led1 : OUT std_logic_vector (0 to 6);
|
||||||
|
led2 : OUT std_logic_vector (0 to 6);
|
||||||
|
led3 : OUT std_logic_vector (0 to 6)
|
||||||
|
);
|
||||||
|
END clicker;
|
||||||
|
|
||||||
|
ARCHITECTURE model OF clicker IS
|
||||||
|
|
||||||
|
SIGNAL val0, val_new0 : std_logic_vector (3 downto 0);
|
||||||
|
SIGNAL val1, val_new1 : std_logic_vector (3 downto 0);
|
||||||
|
SIGNAL val2, val_new2 : std_logic_vector (3 downto 0);
|
||||||
|
SIGNAL val3, val_new3 : std_logic_vector (3 downto 0);
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
val_new0 <= x"0" when raz OR (val0 = x"9")
|
||||||
|
else val0 + 1 when plus
|
||||||
|
else val0;
|
||||||
|
|
||||||
|
val_new1 <= x"0" when raz OR (val1 = x"9")
|
||||||
|
else val1 + 1 when (val0 = x"9")
|
||||||
|
else val1;
|
||||||
|
|
||||||
|
val_new2 <= x"0" when raz OR (val2 = x"9")
|
||||||
|
else val2 + 1 when (val1 = x"9")
|
||||||
|
else val2;
|
||||||
|
|
||||||
|
val_new3 <= x"0" when raz OR (val3 = x"9")
|
||||||
|
else val3 + 1 when (val2 = x"9")
|
||||||
|
else val3;
|
||||||
|
|
||||||
|
memoire :
|
||||||
|
block (ck = '1' AND not ck'stable) begin
|
||||||
|
val0 <= guarded val_new0;
|
||||||
|
val1 <= guarded val_new1;
|
||||||
|
val2 <= guarded val_new2;
|
||||||
|
val3 <= guarded val_new3;
|
||||||
|
end block;
|
||||||
|
|
||||||
|
with val0 select led0 (0 to 6) <=
|
||||||
|
"1111110" when x"0",
|
||||||
|
"0110000" when x"1",
|
||||||
|
"1101101" when x"2",
|
||||||
|
"1111001" when x"3",
|
||||||
|
"0110011" when x"4",
|
||||||
|
"1011011" when x"5",
|
||||||
|
"0011111" when x"6",
|
||||||
|
"1110000" when x"7",
|
||||||
|
"1111111" when x"8",
|
||||||
|
"1111011" when others;
|
||||||
|
|
||||||
|
with val1 select led1 (0 to 6) <=
|
||||||
|
"1111110" when x"0",
|
||||||
|
"0110000" when x"1",
|
||||||
|
"1101101" when x"2",
|
||||||
|
"1111001" when x"3",
|
||||||
|
"0110011" when x"4",
|
||||||
|
"1011011" when x"5",
|
||||||
|
"0011111" when x"6",
|
||||||
|
"1110000" when x"7",
|
||||||
|
"1111111" when x"8",
|
||||||
|
"1111011" when others;
|
||||||
|
|
||||||
|
with val2 select led2 (0 to 6) <=
|
||||||
|
"1111110" when x"0",
|
||||||
|
"0110000" when x"1",
|
||||||
|
"1101101" when x"2",
|
||||||
|
"1111001" when x"3",
|
||||||
|
"0110011" when x"4",
|
||||||
|
"1011011" when x"5",
|
||||||
|
"0011111" when x"6",
|
||||||
|
"1110000" when x"7",
|
||||||
|
"1111111" when x"8",
|
||||||
|
"1111011" when others;
|
||||||
|
|
||||||
|
with val3 select led3 (0 to 6) <=
|
||||||
|
"1111110" when x"0",
|
||||||
|
"0110000" when x"1",
|
||||||
|
"1101101" when x"2",
|
||||||
|
"1111001" when x"3",
|
||||||
|
"0110011" when x"4",
|
||||||
|
"1011011" when x"5",
|
||||||
|
"0011111" when x"6",
|
||||||
|
"1110000" when x"7",
|
||||||
|
"1111111" when x"8",
|
||||||
|
"1111011" when others;
|
||||||
|
|
||||||
|
END model;
|
|
@ -0,0 +1,63 @@
|
||||||
|
#--------------------------------------------------------------------------------
|
||||||
|
# Add an help rule to document a Makefile
|
||||||
|
#
|
||||||
|
# There is two kind of messages
|
||||||
|
#
|
||||||
|
# 1) for configuration variables
|
||||||
|
# add #% at the beginning of a line followed by any text
|
||||||
|
# then put the VARIABLE the next lines this way:
|
||||||
|
# VARIABLE = value#% comment
|
||||||
|
#
|
||||||
|
# 2) for rules
|
||||||
|
# add ## at the beginning of a line followed by any text
|
||||||
|
# then write each rule this way:
|
||||||
|
# rule: ## help message
|
||||||
|
#
|
||||||
|
# Makefile Example
|
||||||
|
# ----------------
|
||||||
|
# include help.mk
|
||||||
|
#
|
||||||
|
# #% MAIN CONFIGURATION
|
||||||
|
# VAR1 = value1#% VAR1 is a example of variable
|
||||||
|
#
|
||||||
|
# #% OPTIONNAL CONFIGURATION
|
||||||
|
# VAR2 = value2#% VAR2 is a example of variable
|
||||||
|
#
|
||||||
|
# ## GENERIC RULES
|
||||||
|
# rule1: ## help message
|
||||||
|
# rule1: dependant files
|
||||||
|
#
|
||||||
|
# rule2: ## help message
|
||||||
|
# rule2: dependant files
|
||||||
|
#
|
||||||
|
# ## MISCELLANEOUS
|
||||||
|
# rule3: ## help message
|
||||||
|
#
|
||||||
|
#--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SHELL := /bin/bash # Use bash syntax
|
||||||
|
R := $(shell tput -Txterm setaf 1) # RED
|
||||||
|
G := $(shell tput -Txterm setaf 2) # GREEN
|
||||||
|
Y := $(shell tput -Txterm setaf 3) # YELLOW
|
||||||
|
C := $(shell tput -Txterm setaf 6) # CYAN
|
||||||
|
W := $(shell tput -Txterm setaf 7) # WHITE
|
||||||
|
Z := $(shell tput -Txterm sgr0) # RESET
|
||||||
|
|
||||||
|
help: ## Show this help.
|
||||||
|
@echo ''
|
||||||
|
@echo 'Usage:'
|
||||||
|
@echo ' ${Y}make ${G}<target>${Z}'
|
||||||
|
@echo ''
|
||||||
|
@awk 'BEGIN {FS="[ ]*\\?=[ ]*|#%"}\
|
||||||
|
/^#% .*$$/ \
|
||||||
|
{printf "%s:\n", substr($$0,4); next}\
|
||||||
|
/^[A-Za-z_-].*=.*#%.*$$/ \
|
||||||
|
{printf " ${Y}%-15s?= ${R}%-12s${G}%s${Z}\n",$$1,$$2,$$3}' $(MAKEFILE_LIST)
|
||||||
|
@echo ''
|
||||||
|
@echo 'Targets:'
|
||||||
|
@awk 'BEGIN {FS=":.*?## "} \
|
||||||
|
/^[a-zA-Z_-]+:.*?##.*$$/ \
|
||||||
|
{printf " ${Y}%-16s${G}%s${Z}\n", $$1, $$2;next}\
|
||||||
|
/^## .*$$/ \
|
||||||
|
{printf " ${C}%s${Z}\n", substr($$1,4)}' $(MAKEFILE_LIST)
|
||||||
|
@echo ''
|
|
@ -0,0 +1,70 @@
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
// Pattern Generator for the Clicker
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "mygenpat.h"
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
/// Get Environment Variables As Arguments
|
||||||
|
|
||||||
|
char* MODEL = GETENV("MODEL","default");
|
||||||
|
unsigned CYCLES = atoi(GETENV("CYCLES","100"));
|
||||||
|
char* TYPE = GETENV("TYPE","BEH");
|
||||||
|
|
||||||
|
/// Define Filename
|
||||||
|
|
||||||
|
if (strcmp(TYPE,"BEH") == 0)
|
||||||
|
DEF_GENPAT (toa("%s_gen",MODEL));
|
||||||
|
else
|
||||||
|
DEF_GENPAT (toa("%s_genx",MODEL));
|
||||||
|
|
||||||
|
/// External Signals (mandatory)
|
||||||
|
|
||||||
|
DECLAR ("ck", ":2", "B", IN, "", "");
|
||||||
|
DECLAR ("raz", ":2", "B", IN, "", "");
|
||||||
|
DECLAR ("plus", ":2", "B", IN, "", "");
|
||||||
|
DECLAR ("vdd", ":2", "B", IN, "", "");
|
||||||
|
DECLAR ("vss", ":2", "B", IN, "", "");
|
||||||
|
DECLAR ("led0", ":2", "B", OUT, vector(0,6), "");
|
||||||
|
DECLAR ("led1", ":2", "B", OUT, vector(0,6), "");
|
||||||
|
DECLAR ("led2", ":2", "B", OUT, vector(0,6), "");
|
||||||
|
DECLAR ("led3", ":2", "B", OUT, vector(0,6), "");
|
||||||
|
|
||||||
|
/// Internal Signals (optionnal)
|
||||||
|
|
||||||
|
if (strcmp(TYPE,"BEH") == 0) {
|
||||||
|
DECLAR (toa("%s_v.%s",MODEL,"val0"), ":2", "X", REGISTER, vector(3,0), "");
|
||||||
|
DECLAR (toa("%s_v.%s",MODEL,"val1"), ":2", "X", REGISTER, vector(3,0), "");
|
||||||
|
DECLAR (toa("%s_v.%s",MODEL,"val2"), ":2", "X", REGISTER, vector(3,0), "");
|
||||||
|
DECLAR (toa("%s_v.%s",MODEL,"val3"), ":2", "X", REGISTER, vector(3,0), "");
|
||||||
|
} else {
|
||||||
|
DECLAR (toa("%s","val0"), ":2", "X", SIGNAL, vector(3,0), "");
|
||||||
|
DECLAR (toa("%s","val1"), ":2", "X", SIGNAL, vector(3,0), "");
|
||||||
|
DECLAR (toa("%s","val2"), ":2", "X", SIGNAL, vector(3,0), "");
|
||||||
|
DECLAR (toa("%s","val3"), ":2", "X", SIGNAL, vector(3,0), "");
|
||||||
|
}
|
||||||
|
/// Signal Values
|
||||||
|
|
||||||
|
AFFECT (cycle (0), "vdd", "1");
|
||||||
|
AFFECT (cycle (0), "vss", "0");
|
||||||
|
|
||||||
|
AFFECT (cycle (0), "raz", "1"); // Only first cycle
|
||||||
|
AFFECT (cycle (1), "raz", "0");
|
||||||
|
|
||||||
|
AFFECT (cycle (0), "plus", "1");
|
||||||
|
|
||||||
|
/// Clock Generator
|
||||||
|
|
||||||
|
int c;
|
||||||
|
for (c = 0; c <= CYCLES; c++) {
|
||||||
|
AFFECT (cycle (c), "ck", itoa (0));
|
||||||
|
AFFECT (next_cycle (c), "ck", itoa (1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Save The Generated Patterns
|
||||||
|
|
||||||
|
SAV_GENPAT ();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
in ck ;;
|
||||||
|
in raz ;;
|
||||||
|
in plus ;;
|
||||||
|
in power(vss,vdd) X;;
|
||||||
|
register clicker_v.val0 (3 downto 0) X;;
|
||||||
|
register clicker_v.val1 (3 downto 0) X;;
|
||||||
|
register clicker_v.val2 (3 downto 0) X;;
|
||||||
|
register clicker_v.val3 (3 downto 0) X;;
|
||||||
|
out led0 (0 to 6) B;;
|
||||||
|
out led1 (0 to 6) B;;
|
||||||
|
out led2 (0 to 6) B;;
|
||||||
|
out led3 (0 to 6) B;;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
: 0 1 1 1 * *******;
|
||||||
|
: 1 1 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
|
||||||
|
END;
|
|
@ -0,0 +1,42 @@
|
||||||
|
in ck ;;
|
||||||
|
in raz ;;
|
||||||
|
in plus ;;
|
||||||
|
in power(vss,vdd) X;;
|
||||||
|
signal val (3 downto 0) X;;
|
||||||
|
out led (0 to 6) B;;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
: 0 1 1 1 * *******;
|
||||||
|
: 1 1 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
: 1 0 1 1 * *******;
|
||||||
|
: 0 0 1 1 * *******;
|
||||||
|
|
||||||
|
END;
|
|
@ -0,0 +1,93 @@
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
// Generic Include File for genpat
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef _MYGENPAT_H_
|
||||||
|
#define _MYGENPAT_H_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include "genpat.h"
|
||||||
|
#include "alloca.h"
|
||||||
|
#include "stdarg.h"
|
||||||
|
#include "mut.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
// since it is not possible to get arguments with genpat,
|
||||||
|
// we use environment variables. The GETENV() macro try to get
|
||||||
|
// the variable env value and we can choose a default value for each
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define GETENV(var,def) getenv(var)?getenv(var):def
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
// Constantes générales
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const PERIOD = 2;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
// rend la date du cycle n°i ou du cycle n°i + 1 demi-cycle
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define cycle(i) itoa(i*PERIOD)
|
||||||
|
#define next_cycle(i) itoa(i*PERIOD + PERIOD/2)
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
// Fabriquer une chaine de caractères à partir d'un entier
|
||||||
|
//
|
||||||
|
// namealloc fait l'équivalent de strdup() mais en plus il teste que la chaine
|
||||||
|
// en paramètre n'a pas déjà été allouée, si oui, namealloc rend
|
||||||
|
// le pointeur sur la chaine déjà allouée, cette opération utilise
|
||||||
|
// un dictionnaire (table de hachage)
|
||||||
|
//
|
||||||
|
// itoa(42) rend un pointeur sur "42"
|
||||||
|
// itoa(42) rend LE MÊME pointeur sur "42"
|
||||||
|
// itoa(0x42,4) rend "0x0042"
|
||||||
|
// itoaX(0x42,1) rend "0x2"
|
||||||
|
// itoaX(0x42,8) rend "0x00000042"
|
||||||
|
// vector(A,B) rend "A downto B" or "A to B" selon la valeur de A et de B
|
||||||
|
// toa("%s%d","test",3) rend "test3"
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
static inline char *itoa (int entier)
|
||||||
|
{
|
||||||
|
char *str = (char *) alloca (32 * sizeof (char)); // allocation dans la pile
|
||||||
|
|
||||||
|
sprintf (str, "%d", entier);
|
||||||
|
return namealloc (str); // utilise un dictionnaire
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char *itoaX (int entier, int size)
|
||||||
|
{
|
||||||
|
int mask;
|
||||||
|
|
||||||
|
for (mask = 0; size; mask = (mask << 1) | 1, size--);
|
||||||
|
char *str = (char *) alloca (32 * sizeof (char)); // allocation dans la pile
|
||||||
|
|
||||||
|
sprintf (str, "0x%0*x", size, entier & mask);
|
||||||
|
return namealloc (str); // utilise un dictionnaire
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char *vector (int from, int to)
|
||||||
|
{
|
||||||
|
char *str = (char *) alloca (32 * sizeof (char)); // allocation dans la pile
|
||||||
|
if (from > to)
|
||||||
|
sprintf (str, "%d downto %d", from, to);
|
||||||
|
else
|
||||||
|
sprintf (str, "%d to %d", from, to);
|
||||||
|
return namealloc (str); // utilise un dictionnaire
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char *toa (char *fmt, ...)
|
||||||
|
{
|
||||||
|
char str[256];
|
||||||
|
va_list ap;
|
||||||
|
va_start (ap, fmt);
|
||||||
|
vsnprintf (str, sizeof(str), fmt, ap);
|
||||||
|
va_end (ap);
|
||||||
|
return namealloc (str); // utilise un dictionnaire
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //_MYGENPAT_H_
|
|
@ -0,0 +1,559 @@
|
||||||
|
# 20230301
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# For SkyWater130
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# globals define
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
|
||||||
|
define physical_grid 0.005
|
||||||
|
define lambda 0.140
|
||||||
|
|
||||||
|
table cif_layer
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name cif_name
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_nwell nwel
|
||||||
|
# rds_pwell pwel
|
||||||
|
rds_activ active
|
||||||
|
rds_ntie nplus
|
||||||
|
rds_ptie pplus
|
||||||
|
rds_nimp nplus
|
||||||
|
rds_pimp pplus
|
||||||
|
rds_poly poly
|
||||||
|
rds_alu1 metal1
|
||||||
|
rds_alu2 metal2
|
||||||
|
rds_alu3 metal3
|
||||||
|
rds_alu4 metal4
|
||||||
|
rds_alu5 metal5
|
||||||
|
rds_alu6 metal6
|
||||||
|
rds_cont contact
|
||||||
|
rds_via1 via1
|
||||||
|
rds_via2 via2
|
||||||
|
rds_via3 via3
|
||||||
|
rds_via4 via4
|
||||||
|
rds_via5 via5
|
||||||
|
rds_cpas pad
|
||||||
|
end
|
||||||
|
|
||||||
|
table gds_layer
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name gds_number
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_nwell 3
|
||||||
|
# rds_pwell 8
|
||||||
|
rds_activ 6
|
||||||
|
rds_ptie 25
|
||||||
|
rds_ntie 26
|
||||||
|
rds_pimp 25
|
||||||
|
rds_nimp 26
|
||||||
|
rds_poly 17 149
|
||||||
|
rds_alu1 31 131
|
||||||
|
rds_alu2 32 132
|
||||||
|
rds_alu3 33 133
|
||||||
|
rds_alu4 34 134
|
||||||
|
rds_alu5 35 135
|
||||||
|
rds_alu6 36 136
|
||||||
|
rds_cont 30
|
||||||
|
rds_via1 51
|
||||||
|
rds_via2 52
|
||||||
|
rds_via3 53
|
||||||
|
rds_via4 54
|
||||||
|
rds_via5 55
|
||||||
|
rds_cpas 43
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_resistor
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name square_resistor(ohm/square) # typical values
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_poly 48
|
||||||
|
rds_alu1 13
|
||||||
|
rds_alu2 0.125
|
||||||
|
rds_alu3 0.125
|
||||||
|
rds_alu4 0.047
|
||||||
|
rds_alu5 0.047
|
||||||
|
rds_alu6 0.029
|
||||||
|
rds_cont 15
|
||||||
|
rds_via1 152
|
||||||
|
rds_via2 4.5
|
||||||
|
rds_via3 3.4
|
||||||
|
rds_via4 3.4
|
||||||
|
rds_via5 0.38
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_poly 25.2e-6 51.8e-6 # Ca max POLY_NWELL 2Cf0 max POLY_NWELL
|
||||||
|
rds_alu1 2.6e-5 8.5e-5 # Ca max M1_NWELL 2Cf0 max M1_NWELL
|
||||||
|
rds_alu2 1.6e-5 7.9e-5 # Ca max M2_NWELL 2Cf0 max M2_NWELL
|
||||||
|
rds_alu3 8.0e-6 6.8e-5 # Ca max M3_NWELL 2Cf0 max M3_NWELL
|
||||||
|
rds_alu4 6.0e-6 6.0e-5 # Ca max M4_NWELL 2Cf0 max M4_NWELL
|
||||||
|
rds_alu5 6.0e-6 6.0e-5 # hyp
|
||||||
|
rds_alu6 6.0e-6 6.0e-5
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa_poly
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa_poly2
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa_alu1
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa_alu2
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa_alu3
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa_alu4
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_capa_alu5
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name area_capa(pif/um^2) peri_capa(pif/um)
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
table mbk_to_rds_segment
|
||||||
|
# ----------------------------------------------------------------------------------
|
||||||
|
# mbk_name rds_name1 dlr dwr offset mode rds_name2 dlr dwr offset mode
|
||||||
|
# ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nwell rds_nwell vw 0.460 0.280 .0 all\
|
||||||
|
rds_pimp vw 0.225 0.170 .0 all
|
||||||
|
|
||||||
|
pwell rds_pwell vw 0.460 0.280 .0 all\
|
||||||
|
rds_nimp vw 0.225 0.170 .0 all
|
||||||
|
|
||||||
|
ndif rds_activ vw 0.070 0.000 .0 all\
|
||||||
|
rds_ndif vw 0.070 0.000 .0 ext
|
||||||
|
|
||||||
|
pdif rds_activ vw 0.070 0.000 .0 all\
|
||||||
|
rds_pdif vw 0.070 0.000 .0 ext
|
||||||
|
|
||||||
|
ntie rds_activ vw 0.145 -0.130 .0 all\
|
||||||
|
rds_ntie vw 0.270 0.120 .0 all\
|
||||||
|
rds_nwell vw 0.460 0.510 .0 all
|
||||||
|
|
||||||
|
ptie rds_activ vw 0.145 -0.130 .0 all\
|
||||||
|
rds_ptie vw 0.270 0.120 .0 all\
|
||||||
|
rds_pwell vw 0.460 0.510 .0 all
|
||||||
|
|
||||||
|
ntrans rds_poly vw -0.075 0.010 .0 all\
|
||||||
|
rds_activ vw -0.210 0.560 .0 drc\
|
||||||
|
rds_ndif lcw -0.210 0.280 0.005 ext\
|
||||||
|
rds_ndif rcw -0.210 0.280 0.005 ext
|
||||||
|
|
||||||
|
ptrans rds_poly vw -0.075 0.010 .0 all\
|
||||||
|
rds_activ vw -0.210 0.560 .0 drc\
|
||||||
|
rds_pdif lcw -0.210 0.280 0.005 ext\
|
||||||
|
rds_pdif rcw -0.210 0.280 0.005 ext
|
||||||
|
|
||||||
|
poly rds_poly vw 0.075 0.010 .0 all
|
||||||
|
|
||||||
|
alu1 rds_alu1 vw 0.165 0.050 .0 all
|
||||||
|
calu1 rds_alu1 vw 0.165 0.050 .0 all
|
||||||
|
talu1 rds_talu1 vw 0.165 0.050 .0 all
|
||||||
|
|
||||||
|
alu2 rds_alu2 vw 0.165 0.050 .0 all
|
||||||
|
calu2 rds_alu2 vw 0.165 0.050 .0 all
|
||||||
|
talu2 rds_talu2 vw 0.165 0.050 .0 all
|
||||||
|
|
||||||
|
alu3 rds_alu3 vw 0.165 0.050 .0 all
|
||||||
|
calu3 rds_alu3 vw 0.165 0.050 .0 all
|
||||||
|
talu3 rds_talu3 vw 0.165 0.050 .0 all
|
||||||
|
end
|
||||||
|
|
||||||
|
table mbk_to_rds_connector
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# mbk_name rds_name der dwr
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table mbk_to_rds_reference
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# mbk_name rds_name width
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
ref_ref rds_ref 0.330
|
||||||
|
ref_con rds_ref 0.330
|
||||||
|
end
|
||||||
|
|
||||||
|
table mbk_to_rds_via
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# mbk_name rds_name1 width mode rds_name2 width mode ...
|
||||||
|
## ------------------------------------------------------------------
|
||||||
|
cont_body_n \
|
||||||
|
rds_cont 0.170 all\
|
||||||
|
rds_alu1 0.330 all\
|
||||||
|
rds_activ 0.290 drc\
|
||||||
|
rds_ntie 0.290 ext
|
||||||
|
|
||||||
|
cont_body_p \
|
||||||
|
rds_cont 0.170 all\
|
||||||
|
rds_alu1 0.330 all\
|
||||||
|
rds_activ 0.290 drc\
|
||||||
|
rds_ptie 0.290 ext
|
||||||
|
|
||||||
|
cont_dif_n \
|
||||||
|
rds_cont 0.170 all\
|
||||||
|
rds_alu1 0.330 all\
|
||||||
|
rds_activ 0.420 drc\
|
||||||
|
rds_ndif 0.420 ext
|
||||||
|
|
||||||
|
cont_dif_p \
|
||||||
|
rds_cont 0.170 all\
|
||||||
|
rds_alu1 0.330 all\
|
||||||
|
rds_activ 0.420 drc\
|
||||||
|
rds_pdif 0.420 ext
|
||||||
|
|
||||||
|
cont_poly \
|
||||||
|
rds_cont 0.170 all\
|
||||||
|
rds_poly 0.290 all\
|
||||||
|
rds_alu1 0.330 all
|
||||||
|
|
||||||
|
cont_via \
|
||||||
|
rds_via1 0.170 all\
|
||||||
|
rds_alu1 0.330 all\
|
||||||
|
rds_alu2 0.330 all
|
||||||
|
|
||||||
|
cont_via2 \
|
||||||
|
rds_via2 0.170 all\
|
||||||
|
rds_alu2 0.330 all\
|
||||||
|
rds_alu3 0.330 all
|
||||||
|
end
|
||||||
|
|
||||||
|
table mbk_to_rds_bigvia_hole
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# mbk_via_name rds_hole_name side step mode
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table mbk_to_rds_bigvia_metal
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# mbk_via_name rds_name dwr overlap mode
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table mbk_to_rds_turnvia
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# mbk_name rds_name dwr mode
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
cont_turn1 rds_alu1 0.050 all
|
||||||
|
cont_turn2 rds_alu1 0.050 all
|
||||||
|
cont_turn3 rds_alu1 0.050 all
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_bulk_implicit
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name type[explicit|implicit]
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_transistor
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# mbk_name trans_name compostion
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_diffusion
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name compostion
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_ndif rds_activ 1 rds_nimp 1 rds_nwell 0
|
||||||
|
rds_pdif rds_activ 1 rds_pimp 1 rds_nwell 1
|
||||||
|
rds_ntie rds_activ 1 rds_nimp 1 rds_nwell 1
|
||||||
|
rds_ptie rds_activ 1 rds_pimp 1 rds_nwell 0
|
||||||
|
end
|
||||||
|
|
||||||
|
table lynx_graph
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name in_contact_with rds_name1 rds_name2 ...
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_ndif rds_cont rds_ndif
|
||||||
|
rds_pdif rds_cont rds_pdif
|
||||||
|
rds_poly rds_cont rds_poly
|
||||||
|
rds_cont rds_pdif rds_ndif rds_poly rds_alu1 rds_cont
|
||||||
|
rds_alu1 rds_cont rds_via1 rds_ref rds_alu1
|
||||||
|
rds_ref rds_cont rds_via1 rds_alu1 rds_ref
|
||||||
|
rds_alu2 rds_via1 rds_via2 rds_alu2
|
||||||
|
rds_alu3 rds_via2 rds_alu3
|
||||||
|
end
|
||||||
|
|
||||||
|
table s2r_oversize_denotch
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name oversized_value_for_denotching
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_nwell 0.635
|
||||||
|
rds_pwell 0.635
|
||||||
|
rds_poly 0.100
|
||||||
|
rds_alu1 0.080
|
||||||
|
rds_alu2 0.080
|
||||||
|
rds_alu3 0.080
|
||||||
|
rds_activ 0.130
|
||||||
|
rds_ntie 0.190
|
||||||
|
rds_ptie 0.190
|
||||||
|
rds_nimp 0.190
|
||||||
|
rds_pimp 0.190
|
||||||
|
end
|
||||||
|
|
||||||
|
table s2r_bloc_ring_width
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name ring_width_to_copy_up
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_nwell 0. # [ RD_NWEL ]
|
||||||
|
rds_pwell 0. # [ RD_PWEL ]
|
||||||
|
rds_poly 0. # [ RD_POLY ]
|
||||||
|
rds_alu1 0. # [ RD_ALU1 ]
|
||||||
|
rds_alu2 0. # [ RD_ALU2 ]
|
||||||
|
rds_alu3 0. # [ RD_ALU3 ]
|
||||||
|
rds_activ 0. # [ RD_ACTI ]
|
||||||
|
rds_ntie 0. # [ RD_NIMP ]
|
||||||
|
rds_ptie 0. # [ RD_PIMP ]
|
||||||
|
rds_nimp 0. # [ RD_NIMP ]
|
||||||
|
rds_pimp 0. # [ RD_PIMP ]
|
||||||
|
end
|
||||||
|
|
||||||
|
table s2r_minimum_layer_width
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name min_layer_width_to_keep
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_nwell 0.840
|
||||||
|
rds_pwell 0.840
|
||||||
|
rds_poly 0.150
|
||||||
|
rds_alu1 0.330
|
||||||
|
rds_alu2 0.330
|
||||||
|
rds_alu3 0.330
|
||||||
|
rds_activ 0.420
|
||||||
|
rds_ntie 0.380
|
||||||
|
rds_ptie 0.380
|
||||||
|
rds_nimp 0.380
|
||||||
|
rds_pimp 0.380
|
||||||
|
end
|
||||||
|
|
||||||
|
table s2r_post_treat
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
# rds_name s2r_must_treat_or_not second_layer_whenever_scotch
|
||||||
|
# -------------------------------------------------------------------
|
||||||
|
rds_nwell treat null
|
||||||
|
rds_pwell treat null
|
||||||
|
rds_poly treat null
|
||||||
|
rds_activ treat null
|
||||||
|
rds_ntie treat rds_pimp
|
||||||
|
rds_ptie treat rds_nimp
|
||||||
|
rds_nimp treat rds_ptie
|
||||||
|
rds_pimp treat rds_ntie
|
||||||
|
rds_alu1 treat null
|
||||||
|
rds_alu2 treat null
|
||||||
|
rds_alu3 treat null
|
||||||
|
rds_cont notreat null
|
||||||
|
end
|
||||||
|
|
||||||
|
DRC_RULES
|
||||||
|
|
||||||
|
layer RDS_NWELL 0.840 ;
|
||||||
|
layer RDS_NTIE 0.380 ;
|
||||||
|
layer RDS_PTIE 0.380 ;
|
||||||
|
layer RDS_NIMP 0.380 ;
|
||||||
|
layer RDS_PIMP 0.380 ;
|
||||||
|
layer RDS_ACTIV 0.420 ;
|
||||||
|
layer RDS_CONT 0.170 ;
|
||||||
|
layer RDS_POLY 0.150 ;
|
||||||
|
layer RDS_ALU1 0.170 ;
|
||||||
|
layer RDS_ALU2 0.170 ;
|
||||||
|
layer RDS_ALU3 0.170 ;
|
||||||
|
layer RDS_USER0 0.005 ;
|
||||||
|
layer RDS_USER1 0.005 ;
|
||||||
|
layer RDS_USER2 0.005 ;
|
||||||
|
|
||||||
|
regles
|
||||||
|
|
||||||
|
# note : ``min'' is different from ``>=''.
|
||||||
|
# min is applied on polygons and >= is applied on rectangles.
|
||||||
|
# there is the same difference between max and <=.
|
||||||
|
# >= is faster than min, but min must be used where it is
|
||||||
|
# required to consider polygons, for example distance of
|
||||||
|
# two objects in the same layer
|
||||||
|
#
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
|
||||||
|
# check the nwell shapes
|
||||||
|
# ----------------------
|
||||||
|
caracterise RDS_NWELL (
|
||||||
|
regle 1 : largeur >= 0.840 ;
|
||||||
|
regle 2 : longueur_inter min 0.840 ;
|
||||||
|
regle 3 : notch >= 1.270 ;
|
||||||
|
);
|
||||||
|
relation RDS_NWELL , RDS_NWELL (
|
||||||
|
regle 4 : distance axiale min 1.270 ;
|
||||||
|
);
|
||||||
|
relation RDS_NWELL , RDS_ACTI (
|
||||||
|
regle 5 : distance axiale min 0.340 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check the RDS_PIMP shapes
|
||||||
|
# -------------------------
|
||||||
|
caracterise RDS_PIMP (
|
||||||
|
regle 6 : surface min 0.255 ;
|
||||||
|
regle 7 : largeur >= 0.380 ;
|
||||||
|
regle 8 : longueur_inter min 0.380 ;
|
||||||
|
regle 9 : notch >= 0.380 ;
|
||||||
|
);
|
||||||
|
relation RDS_PIMP , RDS_PIMP (
|
||||||
|
regle 10 : distance axiale min 0.380 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check the RDS_NIMP shapes
|
||||||
|
# -------------------------
|
||||||
|
caracterise RDS_NIMP (
|
||||||
|
regle 11 : surface min 0.265 ;
|
||||||
|
regle 12 : largeur >= 0.380 ;
|
||||||
|
regle 13 : longueur_inter min 0.380 ;
|
||||||
|
regle 14 : notch >= 0.380 ;
|
||||||
|
);
|
||||||
|
relation RDS_NIMP , RDS_NIMP (
|
||||||
|
regle 15 : distance axiale min 0.380 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check the RDS_PTIE shapes
|
||||||
|
# -------------------------
|
||||||
|
caracterise RDS_PTIE (
|
||||||
|
regle 16 : surface min 0.255 ;
|
||||||
|
regle 17 : largeur >= 0.380 ;
|
||||||
|
regle 18 : longueur_inter min 0.380 ;
|
||||||
|
regle 19 : notch >= 0.380 ;
|
||||||
|
);
|
||||||
|
relation RDS_PTIE , RDS_PTIE (
|
||||||
|
regle 20 : distance axiale min 0.380 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check the RDS_NTIE shapes
|
||||||
|
# -------------------------
|
||||||
|
caracterise RDS_NTIE (
|
||||||
|
regle 21 : surface min 0.265 ;
|
||||||
|
regle 22 : largeur >= 0.380 ;
|
||||||
|
regle 23 : longueur_inter min 0.380 ;
|
||||||
|
regle 24 : notch >= 0.380 ;
|
||||||
|
);
|
||||||
|
relation RDS_NTIE , RDS_NTIE (
|
||||||
|
regle 25 : distance axiale min 0.380 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check the RDS_ACTI shapes
|
||||||
|
# -------------------------
|
||||||
|
caracterise RDS_ACTI (
|
||||||
|
regle 26 : surface min 0.000 ;
|
||||||
|
regle 27 : largeur >= 0.420 ;
|
||||||
|
regle 28 : longueur_inter min 0.420 ;
|
||||||
|
regle 29 : notch >= 0.270 ;
|
||||||
|
);
|
||||||
|
relation RDS_ACTI, RDS_ACTI (
|
||||||
|
regle 30 : distance axiale min 0.270 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check the RDS_NIMP RDS_PTIE exclusion
|
||||||
|
# -------------------------------------
|
||||||
|
define RDS_NIMP , RDS_PTIE intersection -> NPIMP;
|
||||||
|
caracterise NPIMP (
|
||||||
|
regle 31 : largeur = 0. ;
|
||||||
|
);
|
||||||
|
undefine NPIMP;
|
||||||
|
|
||||||
|
# check the RDS_NTIE RDS_PIMP exclusion
|
||||||
|
# -------------------------------------
|
||||||
|
define RDS_NTIE , RDS_PIMP intersection -> NPIMP;
|
||||||
|
caracterise NPIMP (
|
||||||
|
regle 32 : largeur = 0. ;
|
||||||
|
);
|
||||||
|
undefine NPIMP;
|
||||||
|
|
||||||
|
# check the RDS_POLY shapes
|
||||||
|
# -------------------------
|
||||||
|
caracterise RDS_POLY (
|
||||||
|
regle 33 : largeur >= 0.150 ;
|
||||||
|
regle 34 : longueur_inter min 0.150 ;
|
||||||
|
regle 35 : notch >= 0.210 ;
|
||||||
|
);
|
||||||
|
relation RDS_POLY , RDS_POLY (
|
||||||
|
regle 36 : distance axiale min 0.210 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
define RDS_ACTI , RDS_POLY intersection -> channel;
|
||||||
|
|
||||||
|
# check the channel shapes
|
||||||
|
# -------------------------
|
||||||
|
caracterise channel (
|
||||||
|
regle 37 : notch >= 0.210 ;
|
||||||
|
);
|
||||||
|
relation channel , channel (
|
||||||
|
regle 38 : distance axiale min 0.210 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
undefine channel;
|
||||||
|
|
||||||
|
define RDS_ACTI , RDS_CONT intersection -> cont_diff;
|
||||||
|
|
||||||
|
relation RDS_POLY , cont_diff (
|
||||||
|
regle 39 : distance axiale >= 0.250 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
undefine cont_diff;
|
||||||
|
|
||||||
|
# check RDS_ALU1 shapes
|
||||||
|
# ---------------------
|
||||||
|
caracterise RDS_ALU1 (
|
||||||
|
regle 40 : surface min 0.060 ;
|
||||||
|
regle 41 : largeur >= 0.170 ;
|
||||||
|
regle 42 : longueur_inter min 0.170 ;
|
||||||
|
regle 43 : notch >= 0.170 ;
|
||||||
|
);
|
||||||
|
relation RDS_ALU1 , RDS_ALU1 (
|
||||||
|
regle 44 : distance axiale min 0.170 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check any_via layers, stacking are free
|
||||||
|
# ---------------------------------------
|
||||||
|
relation RDS_CONT , RDS_CONT (
|
||||||
|
regle 45 : distance axiale >= 0.170 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
caracterise RDS_CONT (
|
||||||
|
regle 46 : largeur = 0.170 ;
|
||||||
|
regle 47 : longueur = 0.170 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
# check RDS_POLY is distant from activ zone of transistor
|
||||||
|
# -------------------------------------------------------
|
||||||
|
relation RDS_POLY , RDS_ACTIV (
|
||||||
|
regle 48 : distance axiale >= 0.075 ;
|
||||||
|
);
|
||||||
|
|
||||||
|
fin regles
|
||||||
|
DRC_COMMENT
|
||||||
|
END_DRC_COMMENT
|
||||||
|
END_DRC_RULES
|
|
@ -34,6 +34,63 @@ $$index = (vaddr & (0x1FF000 << (9 × (lvl-1)))) >> (12 + (9 × (lvl-1)))$$
|
||||||
|
|
||||||
### Q2
|
### Q2
|
||||||
|
|
||||||
|
fait.
|
||||||
|
|
||||||
|
## Exercice 3
|
||||||
|
|
||||||
|
### Q1
|
||||||
|
|
||||||
|
L'adresse 0x2000000030 correspond à la zone de pile (stack) utilisateur,
|
||||||
|
on peut donc supposer que la faute de page est provoquée par un appel de fonction
|
||||||
|
effectué depuis le code utilisateur.
|
||||||
|
|
||||||
|
### Q2
|
||||||
|
|
||||||
|
+----------------------+ 0xffffffffffffffff
|
||||||
|
| Higher half |
|
||||||
|
| (unused) |
|
||||||
|
+----------------------+ 0xffff800000000000
|
||||||
|
| (impossible address) |
|
||||||
|
+----------------------+ 0x00007fffffffffff
|
||||||
|
| User |
|
||||||
|
| (text + data + heap) |
|
||||||
|
+----------------------+ 0x2000000000
|
||||||
|
| User |
|
||||||
|
| (stack) |
|
||||||
|
+----------------------+ 0x40000000
|
||||||
|
| Kernel |
|
||||||
|
| (valloc) |
|
||||||
|
+----------------------+ 0x201000
|
||||||
|
| Kernel |
|
||||||
|
| (APIC) |
|
||||||
|
+----------------------+ 0x200000
|
||||||
|
| Kernel |
|
||||||
|
| (text + data) |
|
||||||
|
+----------------------+ 0x100000
|
||||||
|
| Kernel |
|
||||||
|
| (BIOS + VGA) |
|
||||||
|
+----------------------+ 0x0
|
||||||
|
|
||||||
|
Pour toutes les tâches, les zones communes sont évidemment celles du noyau (car
|
||||||
|
il faut pouvoir effectuer des appels système notamment, avoir un buffer VGA
|
||||||
|
fonctionnel).
|
||||||
|
|
||||||
|
On va donc avoir en commun :
|
||||||
|
|
||||||
|
+----------------------+ 0x40000000
|
||||||
|
| Kernel |
|
||||||
|
| (valloc) |
|
||||||
|
+----------------------+ 0x201000
|
||||||
|
| Kernel |
|
||||||
|
| (APIC) |
|
||||||
|
+----------------------+ 0x200000
|
||||||
|
| Kernel |
|
||||||
|
| (text + data) |
|
||||||
|
+----------------------+ 0x100000
|
||||||
|
| Kernel |
|
||||||
|
| (BIOS + VGA) |
|
||||||
|
+----------------------+ 0x0
|
||||||
|
|
||||||
|
### Q3
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ void main_multiboot2(void *mb2)
|
||||||
|
|
||||||
fake.pgt = store_cr3();
|
fake.pgt = store_cr3();
|
||||||
new = alloc_page();
|
new = alloc_page();
|
||||||
map_page(&fake, 0xFFFFFFFFFFF, new);
|
map_page(&fake, 0x201000, new);
|
||||||
|
|
||||||
printk("-----------\n\n");
|
printk("-----------\n\n");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue