Forum Replies Created

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • in reply to: unable to get the output waveform #1290
    RASHMISHREE ROUTRASHMISHREE ROUT
    Participant

    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, 1 month ago by UmbertoUmberto. Reason: please use the code tags to open/close a code snippet
    in reply to: unable to get the output waveform #1287
    RASHMISHREE ROUTRASHMISHREE ROUT
    Participant

    Sorry, 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.

    in reply to: vhdl component file is not generated #1211
    RASHMISHREE ROUTRASHMISHREE ROUT
    Participant

    I 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:
Viewing 3 posts - 1 through 3 (of 3 total)