Forum Replies Created
Viewing 3 posts - 1 through 3 (of 3 total)
-
AuthorPosts
-
RASHMISHREE ROUTParticipant
Sir,
Here I am giving the “definition.vhd” . Kindly try my layout and let me know why am I unable to get the output.-------------------------------------------------------------------------------- -- Definitions and parameters automatically generate by MagCAD -- -- Please use MagCAD to change technological parameters -- -------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.math_real.all; package definitions_pnml is --circuit parameters constant longest_path : integer := 5; --number of magnet crossed by the longest path --fields constants constant H_pulse : real := 560.0; --field pulse amplitude [Oe] constant H_clock : real := 560.0; --clocking field amplitude[Oe] constant H_int : real := 190.0; --intrinsic pinning field[Oe] --time constants constant T_prop : real := 1.1e-08; --Original value 1.05396e-08 effective clock pulse [s] constant T_nuc : real := 5.6e-07; --Original value 5.5752e-07 nucleation time [s] --Probability extremes constant P_nuc_critical : real := 0.95; --critical nucleation probability constant P_prev_critical : real := 0.05; --critical nucleation prevent probability --base components constants constant dw_length : real := 1.0e-07; --grid size [meters] constant dw_width : real := 2.0e-08; --width of the domainwall [meters] constant v_00 : real := 1.14e+06; --numerical prefactor in depinning regime [m/s] constant E_pin : real := 12.1; --pinning energy barrier (incluedes the K_bT constant) constant v_0 : real := 31.9; --numerical prefactor in flow regime [m/s] constant u_w : real := 0.042; --domain wall mobility [m/sOe] constant C_inv : real := 153.0; --Coupling field strength [Oe] constant C_mv : real := 48.0; --coupling field constant f_0 : real := 2.0e+09; --Attempt frequency [Hz] constant M_co : real := 1.4e+06; --Saturation magnetization Co constant t_Co : real := 3.2e-09; --Co thickness [m] constant t_stack : real := 6.2e-09; --stack thickness [m] constant K_eff : real := 2.0e+05; --effective anisotropy [J/m^3] constant u_0 : real := 1.256e-6; --permeability constant constant g_FIB : real := 0.1416; --fib irradiation factor constant V_ANC : real := 1.68e-23; --volume of the ANC constant K_B : real := 1.3807e-23; --Boltzmann constant constant T : real := 293.0; --temperature in Kelvin --notch component constants constant A : real := 1.3e-11; --exchange stiffness constant apex : real :=(51.5* MATH_PI)/180.0; --apex angle constant h : real := 5.4e-08; --notch width constant V_a : real := 1.26e-23; --Activation volume constant P_dep : real := 0.98; --Used to find the T_sync (1.0 - EXP(-T_sync/Tau_eff_notch) ) --domainwall via constants constant C_via : real := 75.0; --coupling field for the via --Formula for the parameters constant M_s : real := M_Co * (t_Co/T_stack); --saturation magnetization constant K_anc : real := g_FIB * K_eff; --ANC anisotropy constant H_0 : real := ((2.0 * K_anc)/(u_0*M_s))*0.01256; --coercive field at zero temperature constant E_0 : real := (K_anc * V_ANC)/(K_B*T); --energy barrier at 0 field (incluedes the K_bT constant) constant T_eff : real := T_prop + T_nuc; constant T_rise : real := T_eff / 4.0; constant T_clock : real := T_eff + T_rise; --Effective pulse time --NOTCH parameters formulas constant d_W : real := MATH_PI*SQRT(A/K_eff); --characteristic DW width constant o_W : real := 4.0 * SQRT(A*K_eff); --DW energy density constant H_depin : real := H_int + (o_W * SIN(apex))/(2.0*M_s*(h + 0.5*d_W*SIN(apex)))*10000.0; --Depinning Field constant H_sync : real := H_depin - H_pulse + 1.0; --In plane field constant H_eff_notch : real := H_pulse + H_sync; --Effective field to depin a notch constant T_depin : real := (1.0/f_0) * EXP((M_s*V_a*((H_depin - H_eff_notch)/10000.0))/(K_B*T)); --Depinning time constant E_barrier_notch : real := (M_s*V_a*(H_depin - H_eff_notch))/10000.0; --Energy barrier constant Tau_eff_notch : real := (1.0/f_0) * EXP(E_barrier_notch/(K_b*T)); --Effective time to depin a notch constant t_sync : real := -Tau_eff_notch*LOG(1.0 - P_dep); --In plane pulse time --generic model constants --Set here the number of parameters that you want to analyse: e.g. the critical path. constant NParameters : integer := 3; --number of model parameters constant par_TIME : integer := 0; --position of propagation time in PARAM_DATA. Here each component add its delay constant par_TIME_NUC : integer := 1; constant par_CR_TIME : integer := 2; --position of critical propagation time in PARAM_DATA. Here is memorized the current critical path. --data type --vector including parameters of the model defined in the generic constants type param_data is array(0 to NParameters -1) of real; type param_data_vector is array(integer range <>) of param_data; --DELCARATIONS --functions declarations function propagation_time return real; function propagation_length return real; function t_nuc_via return real; --procedure to determine the velocity_DW according to the H_pulse, so to the regime procedure velocity_dw (v_DW : out real); --procedure to compute the probability of nucleation. It uses the current state of the circuit to compute the probaility to nucleate or to ramin in the current state procedure probability_nuc (signal input_state: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real); procedure probability_mv (signal input_A: in std_logic; signal input_B: in std_logic; signal input_C: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real); procedure probability_via(signal input_state: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real); procedure probability_mv5 (signal input_A: in std_logic; signal input_B: in std_logic; signal input_C: in std_logic; signal input_D: in std_logic; signal input_E: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real); --procedure to compute the critical path. procedure critical_path_computation (signal param_data_in : param_data; critical_path : out real); procedure critical_path_computation_mv (signal param_data_in_A : param_data; signal param_data_in_B : param_data; signal param_data_in_C : param_data; critical_path : out real); procedure critical_path_computation_mv5 (signal param_data_in_A : param_data; signal param_data_in_B : param_data; signal param_data_in_C : param_data; signal param_data_in_D : param_data; signal param_data_in_E : param_data; critical_path : out real); --function to compute the minimum nucleation time function minimum_nuc_time return real; end definitions_pnml; ----------------------------------------- BODY ----------------------------------------- package body definitions_pnml is procedure velocity_DW(v_DW : out real) is begin if (H_pulse < H_int) then v_DW := 1.0; elsif (H_pulse > H_int and H_pulse < 330.0) then v_DW := v_00 * EXP(E_pin*(H_int/H_pulse)**0.25); elsif (H_pulse >= 330.0 and H_pulse < 750.0) then v_DW := v_0 + u_w*(H_pulse - H_int); elsif (H_pulse >= 750.0) then v_DW := 57.0; end if; end velocity_DW; function propagation_time return real is variable result : real; variable velocity : real; begin velocity_DW(velocity); result := dw_length / velocity; return result; end; function propagation_length return real is variable result : real; variable velocity : real; begin velocity_DW(velocity); result := velocity * T_eff; return result; end; function t_nuc_via return real is variable result : real; variable H_eff_via, Tau_eff_via : real; begin H_eff_via := H_pulse + C_via; Tau_eff_via := (1.0/f_0) * EXP(E_0*(1.0-(H_eff_via/H_0))**2.0); result := -Tau_eff_via*LOG(1.0 - P_nuc_critical); return result; end; function minimum_nuc_time return real is variable result : real; variable H_eff_critical_mv, Tau_eff_critical_mv, T_nuc_min_mv : real; variable H_eff_critical_nc, Tau_eff_critical_nc, T_nuc_min_nc : real; variable H_eff_critical_via, Tau_eff_critical_via, T_nuc_min_via : real; begin H_eff_critical_mv := H_pulse + C_mv; Tau_eff_critical_mv := (1.0/f_0) * EXP(E_0*(1.0-(H_eff_critical_mv/H_0))**2.0); T_nuc_min_mv := -Tau_eff_critical_mv*LOG(1.0 - P_nuc_critical); H_eff_critical_nc := H_pulse + C_inv; Tau_eff_critical_nc := (1.0/f_0) * EXP(E_0*(1.0-(H_eff_critical_nc/H_0))**2.0); T_nuc_min_nc := -Tau_eff_critical_nc*LOG(1.0 - P_nuc_critical); H_eff_critical_via := H_pulse + C_via; Tau_eff_critical_via := (1.0/f_0) * EXP(E_0*(1.0-(H_eff_critical_via/H_0))**2.0); T_nuc_min_via := -Tau_eff_critical_via*LOG(1.0 - P_nuc_critical); if T_nuc_min_mv > T_nuc_min_nc and T_nuc_min_mv > T_nuc_min_via then result := T_nuc_min_mv; elsif T_nuc_min_nc > T_nuc_min_mv and T_nuc_min_nc > T_nuc_min_via then result := T_nuc_min_nc; elsif T_nuc_min_via > T_nuc_min_mv and T_nuc_min_via > T_nuc_min_nc then result := T_nuc_min_via; end if; return result; end; procedure probability_nuc (signal input_state: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real) is variable M : real; variable C_eff : real; variable H_eff : real; variable Tau_eff : real; variable Tau_prev : real; begin if current_state /= 'U' then if input_state = current_state then M := -1.0; elsif input_state /= current_state then M := 1.0; end if; else M := -1.0; end if; C_eff := C_inv*M; --Effective coupling H_eff := H_clock - C_eff; --Effective field Tau_eff :=(1.0/f_0) * EXP(E_0*(1.0-(H_eff/H_0))**2.0); --switching time, reverse of switching rate P_nuc := 1.0 - EXP(-(T_nuc/Tau_eff)); --Nucleation probability Tau_prev :=(1.0/f_0) * EXP(E_0*(1.0-((H_pulse - C_inv)/H_0))**2.0); --switching time, reverse of switching rate in case of antiparallel coupling P_prev := 1.0 - EXP(-(T_eff/Tau_prev)); --prevent Nucleation probability end probability_nuc; procedure probability_mv (signal input_A: in std_logic; signal input_B: in std_logic; signal input_C: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real) is variable M0, M1, M2 : real; variable C_eff : real; variable H_eff : real; variable Tau_eff : real; variable Tau_prev : real; begin if current_state /= 'U' then if input_A = current_state then M0 := -1.0; elsif input_A /= current_state then M0 := 1.0; end if; if input_B = current_state then M1 := -1.0; elsif input_B /= current_state then M1 := 1.0; end if; if input_C = current_state then M2 := -1.0; elsif input_C /= current_state then M2 := 1.0; end if; else M0 := -1.0; M1 := -1.0; M2 := -1.0; end if; C_eff := C_mv*M0 + C_mv*M1 + C_mv*M2; --Effective coupling H_eff := H_clock - C_eff; --Effective field Tau_eff :=(1.0/f_0) * EXP(E_0*(1.0-(H_eff/H_0))**2.0); --switching time, reverse of switching rate P_nuc := 1.0 - EXP(-(T_nuc/Tau_eff)); --Nucleation probability --worst case, so when the coupling field reduces less the H_pulse Tau_prev :=(1.0/f_0) * EXP(E_0*(1.0-((H_pulse - C_mv)/H_0))**2.0); --switching time, reverse of switching rate in case of antiparallel coupling P_prev := 1.0 - EXP(-(T_eff/Tau_prev)); --prevent Nucleation probability end probability_mv; procedure probability_via (signal input_state: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real) is variable M : real; variable C_eff : real; variable H_eff : real; variable Tau_eff : real; variable Tau_prev : real; begin if current_state /= 'U' then if input_state = current_state then M := -1.0; elsif input_state /= current_state then M := 1.0; end if; else M := -1.0; end if; C_eff := C_via*M; --Effective coupling H_eff := H_clock - C_eff; --Effective field Tau_eff :=(1.0/f_0) * EXP(E_0*(1.0-(H_eff/H_0))**2.0); --switching time, reverse of switching rate P_nuc := 1.0 - EXP(-(T_nuc/Tau_eff)); --Nucleation probability Tau_prev :=(1.0/f_0) * EXP(E_0*(1.0-((H_pulse - C_via)/H_0))**2.0); --switching time, reverse of switching rate in case of antiparallel coupling P_prev := 1.0 - EXP(-(T_eff/Tau_prev)); --prevent Nucleation probability end probability_via; procedure critical_path_computation (signal param_data_in : param_data; critical_path : out real) is variable path : real; variable current_critical_path : real; begin path := param_data_in(par_TIME); current_critical_path := param_data_in(par_CR_TIME); if path > current_critical_path then critical_path := path; else critical_path := current_critical_path; end if; end critical_path_computation; procedure critical_path_computation_mv (signal param_data_in_A : param_data; signal param_data_in_B : param_data; signal param_data_in_C : param_data; critical_path : out real) is variable path : real; variable current_critical_path : real; begin --find the critical path from the inputs if (param_data_in_A(par_TIME) >= param_data_in_B(par_TIME)) and (param_data_in_A(par_TIME) >= param_data_in_C(par_TIME)) then path := param_data_in_A(par_TIME); elsif param_data_in_B(par_TIME) >= param_data_in_A(par_TIME) and param_data_in_B(par_TIME) >= param_data_in_C(par_TIME) then path := param_data_in_B(par_TIME); elsif param_data_in_C(par_TIME) >= param_data_in_A(par_TIME) and param_data_in_C(par_TIME) >= param_data_in_B(par_TIME) then path := param_data_in_C(par_TIME); end if; if (param_data_in_A(par_CR_TIME) >= param_data_in_B(par_CR_TIME)) and (param_data_in_A(par_CR_TIME) >= param_data_in_C(par_CR_TIME)) then current_critical_path := param_data_in_A(par_CR_TIME); elsif param_data_in_B(par_CR_TIME) >= param_data_in_A(par_CR_TIME) and param_data_in_B(par_CR_TIME) >= param_data_in_C(par_CR_TIME) then current_critical_path := param_data_in_B(par_CR_TIME); elsif param_data_in_C(par_CR_TIME) >= param_data_in_A(par_CR_TIME) and param_data_in_C(par_CR_TIME) >= param_data_in_B(par_CR_TIME) then current_critical_path := param_data_in_C(par_CR_TIME); end if; if path > current_critical_path then critical_path := path; else critical_path := current_critical_path; end if; end critical_path_computation_mv; procedure probability_mv5 (signal input_A: in std_logic; signal input_B: in std_logic; signal input_C: in std_logic; signal input_D: in std_logic; signal input_E: in std_logic; signal current_state: in std_logic; P_nuc: out real; P_prev : out real) is variable M0, M1, M2, M3, M4 : real; variable C_eff : real; variable H_eff : real; variable Tau_eff : real; variable Tau_prev : real; begin if current_state /= 'U' then if input_A = current_state then M0 := -1.0; elsif input_A /= current_state then M0 := 1.0; end if; if input_B = current_state then M1 := -1.0; elsif input_B /= current_state then M1 := 1.0; end if; if input_C = current_state then M2 := -1.0; elsif input_C /= current_state then M2 := 1.0; end if; if input_D = current_state then M3 := -1.0; elsif input_D /= current_state then M3 := 1.0; end if; if input_E = current_state then M4 := -1.0; elsif input_E /= current_state then M4 := 1.0; end if; else M0 := -1.0; M1 := -1.0; M2 := -1.0; M3 := -1.0; M4 := -1.0; end if; C_eff := C_mv*M0 + C_mv*M1 + C_mv*M2 + C_mv*M3 + C_mv*M4; --Effective coupling H_eff := H_clock - C_eff; --Effective field Tau_eff :=(1.0/f_0) * EXP(E_0*(1.0-(H_eff/H_0))**2.0); --switching time, reverse of switching rate P_nuc := 1.0 - EXP(-(T_nuc/Tau_eff)); --Nucleation probability --worst case, so when the coupling field reduces less the H_pulse Tau_prev :=(1.0/f_0) * EXP(E_0*(1.0-((H_pulse - C_mv)/H_0))**2.0); --switching time, reverse of switching rate in case of antiparallel coupling P_prev := 1.0 - EXP(-(T_eff/Tau_prev)); --prevent Nucleation probability end probability_mv5; procedure critical_path_computation_mv5 (signal param_data_in_A : param_data; signal param_data_in_B : param_data; signal param_data_in_C : param_data; signal param_data_in_D : param_data; signal param_data_in_E : param_data; critical_path : out real) is variable path : real; variable current_critical_path : real; begin --find the critical path from the inputs if (param_data_in_A(par_TIME) >= param_data_in_B(par_TIME)) and (param_data_in_A(par_TIME) >= param_data_in_C(par_TIME)) and (param_data_in_A(par_TIME) >= param_data_in_D(par_TIME)) and (param_data_in_A(par_TIME) >= param_data_in_E(par_TIME)) then path := param_data_in_A(par_TIME); elsif param_data_in_B(par_TIME) >= param_data_in_A(par_TIME) and (param_data_in_B(par_TIME) >= param_data_in_C(par_TIME)) and (param_data_in_B(par_TIME) >= param_data_in_D(par_TIME)) and (param_data_in_B(par_TIME) >= param_data_in_E(par_TIME)) then path := param_data_in_B(par_TIME); elsif param_data_in_C(par_TIME) >= param_data_in_A(par_TIME) and (param_data_in_C(par_TIME) >= param_data_in_B(par_TIME)) and (param_data_in_C(par_TIME) >= param_data_in_D(par_TIME)) and (param_data_in_C(par_TIME) >= param_data_in_E(par_TIME)) then path := param_data_in_C(par_TIME); elsif (param_data_in_D(par_TIME) >= param_data_in_A(par_TIME)) and (param_data_in_D(par_TIME) >= param_data_in_B(par_TIME)) and (param_data_in_D(par_TIME) >= param_data_in_C(par_TIME)) and (param_data_in_D(par_TIME) >= param_data_in_E(par_TIME)) then path := param_data_in_D(par_TIME); elsif (param_data_in_E(par_TIME) >= param_data_in_A(par_TIME)) and (param_data_in_E(par_TIME) >= param_data_in_B(par_TIME)) and (param_data_in_E(par_TIME) >= param_data_in_C(par_TIME)) and (param_data_in_E(par_TIME) >= param_data_in_D(par_TIME)) then path := param_data_in_E(par_TIME); end if; if (param_data_in_A(par_CR_TIME) >= param_data_in_B(par_CR_TIME)) and (param_data_in_A(par_CR_TIME) >= param_data_in_C(par_CR_TIME)) and (param_data_in_A(par_CR_TIME) >= param_data_in_D(par_CR_TIME)) and (param_data_in_A(par_CR_TIME) >= param_data_in_E(par_CR_TIME)) then current_critical_path := param_data_in_A(par_CR_TIME); elsif param_data_in_B(par_CR_TIME) >= param_data_in_A(par_CR_TIME) and (param_data_in_B(par_CR_TIME) >= param_data_in_C(par_CR_TIME)) and (param_data_in_B(par_CR_TIME) >= param_data_in_D(par_CR_TIME)) and (param_data_in_B(par_CR_TIME) >= param_data_in_E(par_CR_TIME)) then current_critical_path := param_data_in_B(par_CR_TIME); elsif param_data_in_C(par_CR_TIME) >= param_data_in_A(par_CR_TIME) and (param_data_in_C(par_CR_TIME) >= param_data_in_B(par_CR_TIME)) and (param_data_in_C(par_CR_TIME) >= param_data_in_D(par_CR_TIME)) and (param_data_in_C(par_CR_TIME) >= param_data_in_E(par_CR_TIME)) then current_critical_path := param_data_in_C(par_CR_TIME); elsif (param_data_in_D(par_CR_TIME) >= param_data_in_A(par_CR_TIME)) and (param_data_in_D(par_CR_TIME) >= param_data_in_B(par_CR_TIME)) and (param_data_in_D(par_CR_TIME) >= param_data_in_C(par_CR_TIME)) and (param_data_in_D(par_CR_TIME) >= param_data_in_E(par_CR_TIME)) then current_critical_path := param_data_in_D(par_CR_TIME); elsif (param_data_in_E(par_CR_TIME) >= param_data_in_A(par_CR_TIME)) and (param_data_in_E(par_CR_TIME) >= param_data_in_B(par_CR_TIME)) and (param_data_in_E(par_CR_TIME) >= param_data_in_C(par_CR_TIME)) and (param_data_in_E(par_CR_TIME) >= param_data_in_D(par_CR_TIME)) then current_critical_path := param_data_in_E(par_CR_TIME); end if; if path > current_critical_path then critical_path := path; else critical_path := current_critical_path; end if; end critical_path_computation_mv5; end definitions_pnml;
- This reply was modified 6 years, 11 months ago by Umberto. Reason: please use the code tags to open/close a code snippet
RASHMISHREE ROUTParticipantSorry, in my last post i have mistakenly mentioned that in my testbench it’s showing one input as 1-bit and the other as 3-bit. but it’s taking the other as 4-bit.
RASHMISHREE ROUTParticipantI am trying to design a 3-d majority votor in MagCAD. After completing the design part, export component is also showing successful but vhdl file is not generating as i have mentioned in my previous post. Here is the design.
Attachments:
-
AuthorPosts
Viewing 3 posts - 1 through 3 (of 3 total)