<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://cidr.up-microlab.org/index.php?action=history&amp;feed=atom&amp;title=Layout_script_for_NAND_gate</id>
	<title>Layout script for NAND gate - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://cidr.up-microlab.org/index.php?action=history&amp;feed=atom&amp;title=Layout_script_for_NAND_gate"/>
	<link rel="alternate" type="text/html" href="https://cidr.up-microlab.org/index.php?title=Layout_script_for_NAND_gate&amp;action=history"/>
	<updated>2026-05-19T10:23:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://cidr.up-microlab.org/index.php?title=Layout_script_for_NAND_gate&amp;diff=492&amp;oldid=prev</id>
		<title>Ryan Antonio at 13:51, 16 November 2022</title>
		<link rel="alternate" type="text/html" href="https://cidr.up-microlab.org/index.php?title=Layout_script_for_NAND_gate&amp;diff=492&amp;oldid=prev"/>
		<updated>2022-11-16T13:51:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:51, 16 November 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[code]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;def draw_layout(self):&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;def draw_layout(self):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l163&quot;&gt;Line 163:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 164:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     self.sch_params['sch_dummy_info'] = sch_dummy_info&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     self.sch_params['sch_dummy_info'] = sch_dummy_info&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     self.sch_dummy_info=sch_dummy_info&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     self.sch_dummy_info=sch_dummy_info&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[/code]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ryan Antonio</name></author>
	</entry>
	<entry>
		<id>https://cidr.up-microlab.org/index.php?title=Layout_script_for_NAND_gate&amp;diff=491&amp;oldid=prev</id>
		<title>Ryan Antonio: Created page with &quot;def draw_layout(self):  	#============================================== 	# Extracting parameters from the __init__.py 	#==============================================         	lch           = self.params['lch'] 	tran_intent   = self.params['tran_intent'] 	nmos_nf       = self.params['nmos_nf'] 	pmos_nf       = self.params['pmos_nf'] 	guard_ring_nf = self.params['guard_ring_nf'] 	pin_loc       = self.params['pin_loc'] 	nmos_w        = self.params['nmos_w'] 	pmos_w...&quot;</title>
		<link rel="alternate" type="text/html" href="https://cidr.up-microlab.org/index.php?title=Layout_script_for_NAND_gate&amp;diff=491&amp;oldid=prev"/>
		<updated>2022-11-16T13:50:06Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;def draw_layout(self):  	#============================================== 	# Extracting parameters from the __init__.py 	#==============================================         	lch           = self.params[&amp;#039;lch&amp;#039;] 	tran_intent   = self.params[&amp;#039;tran_intent&amp;#039;] 	nmos_nf       = self.params[&amp;#039;nmos_nf&amp;#039;] 	pmos_nf       = self.params[&amp;#039;pmos_nf&amp;#039;] 	guard_ring_nf = self.params[&amp;#039;guard_ring_nf&amp;#039;] 	pin_loc       = self.params[&amp;#039;pin_loc&amp;#039;] 	nmos_w        = self.params[&amp;#039;nmos_w&amp;#039;] 	pmos_w...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;def draw_layout(self):&lt;br /&gt;
&lt;br /&gt;
	#==============================================&lt;br /&gt;
	# Extracting parameters from the __init__.py&lt;br /&gt;
	#==============================================&lt;br /&gt;
       &lt;br /&gt;
	lch           = self.params['lch']&lt;br /&gt;
	tran_intent   = self.params['tran_intent']&lt;br /&gt;
	nmos_nf       = self.params['nmos_nf']&lt;br /&gt;
	pmos_nf       = self.params['pmos_nf']&lt;br /&gt;
	guard_ring_nf = self.params['guard_ring_nf']&lt;br /&gt;
	pin_loc       = self.params['pin_loc']&lt;br /&gt;
	nmos_w        = self.params['nmos_w']&lt;br /&gt;
	pmos_w        = self.params['pmos_w']&lt;br /&gt;
	ntap_w        = self.params['ntap_w']&lt;br /&gt;
	ptap_w        = self.params['ptap_w']&lt;br /&gt;
	flip_well     = self.params['flip_well']&lt;br /&gt;
	show_pins     = True&lt;br /&gt;
&lt;br /&gt;
	#==============================================&lt;br /&gt;
	# Setting up other variables in here&lt;br /&gt;
	#==============================================&lt;br /&gt;
&lt;br /&gt;
    # 2 x the longest finger size&lt;br /&gt;
	# Because we'll instance 2 transistors in one row&lt;br /&gt;
	# We added more fingers for allowance on the sides&lt;br /&gt;
	# This sets how wide the base is&lt;br /&gt;
    fg_tot = 2*max(nmos_nf,pmos_nf)+8 &lt;br /&gt;
&lt;br /&gt;
    # Drawing parameters&lt;br /&gt;
	# We only need 1 row of NMOS and 1 row of PMOS&lt;br /&gt;
	# Both of them are of the same transistor flavor&lt;br /&gt;
    nw_list = [nmos_w ] &lt;br /&gt;
    n_intent_list = [tran_intent]&lt;br /&gt;
    pw_list = [pmos_w ]&lt;br /&gt;
    p_intent_list = [tran_intent]&lt;br /&gt;
&lt;br /&gt;
    # Routing track definitions&lt;br /&gt;
    ng_tracks = [2]&lt;br /&gt;
    pg_tracks = [2]&lt;br /&gt;
&lt;br /&gt;
    nds_tracks = [2]&lt;br /&gt;
    pds_tracks = [6]&lt;br /&gt;
&lt;br /&gt;
    # MX means orient the gate up&lt;br /&gt;
	# R0 means orient the gate down&lt;br /&gt;
	# All NMOS orient up while all PMOS orient down&lt;br /&gt;
    n_orientations=['MX']&lt;br /&gt;
    p_orientations=['R0']&lt;br /&gt;
    top_layer=5&lt;br /&gt;
&lt;br /&gt;
	#==============================================&lt;br /&gt;
	# Drawing the base&lt;br /&gt;
	#==============================================&lt;br /&gt;
&lt;br /&gt;
    self.draw_base(lch, fg_tot, ptap_w, ntap_w, nw_list,&lt;br /&gt;
                   n_intent_list, pw_list, p_intent_list,&lt;br /&gt;
                   ng_tracks=ng_tracks, nds_tracks=nds_tracks,&lt;br /&gt;
                   pg_tracks=pg_tracks, pds_tracks=pds_tracks,&lt;br /&gt;
                   n_orientations=n_orientations, p_orientations=p_orientations, &lt;br /&gt;
                   top_layer=top_layer,&lt;br /&gt;
                   guard_ring_nf=guard_ring_nf)&lt;br /&gt;
&lt;br /&gt;
	#==============================================&lt;br /&gt;
	# Drawing transistors&lt;br /&gt;
	#==============================================&lt;br /&gt;
	# As a quick guide:&lt;br /&gt;
	# mos_type   = pick 'nch' for NMOS or 'pch' for PMOS&lt;br /&gt;
	# row        = row # relative to the NMOS or PMOS&lt;br /&gt;
	# start_col  = starting horizontal location&lt;br /&gt;
	# source_dir = source direction. If it's 2 it points downward, if it's 0 it points upward.&lt;br /&gt;
	# drain_dir  = same as source_dir&lt;br /&gt;
	# s_net      = assigning source terminal name&lt;br /&gt;
	# d_net      = assigning source terminal name&lt;br /&gt;
	# Simply call the self.draw_mos_conn() function to draw the transistor.&lt;br /&gt;
&lt;br /&gt;
    mos_type   = 'nch'&lt;br /&gt;
    row        = 0&lt;br /&gt;
    start_col  = 3&lt;br /&gt;
    nf         = nmos_nf&lt;br /&gt;
    source_dir = 2&lt;br /&gt;
    drain_dir  = 0&lt;br /&gt;
    s_net      = 'X'&lt;br /&gt;
    d_net      = 'Q'&lt;br /&gt;
    nmos0      = self.draw_mos_conn(mos_type, row, start_col, nf, source_dir, drain_dir, s_net=s_net, d_net=d_net )&lt;br /&gt;
&lt;br /&gt;
    start_col  = 3 + nmos_nf + 2&lt;br /&gt;
    s_net      = 'VSS'&lt;br /&gt;
    d_net      = 'X'&lt;br /&gt;
    nmos1      = self.draw_mos_conn(mos_type, row, start_col, nf, source_dir, drain_dir, s_net=s_net, d_net=d_net )&lt;br /&gt;
&lt;br /&gt;
    mos_type   = 'pch'&lt;br /&gt;
    start_col  = 3&lt;br /&gt;
    nf         = pmos_nf&lt;br /&gt;
    source_dir = 0&lt;br /&gt;
    drain_dir  = 2&lt;br /&gt;
    s_net      = 'VDD'&lt;br /&gt;
    d_net      = 'Q'&lt;br /&gt;
    pmos0      = self.draw_mos_conn(mos_type, row, start_col, nf, source_dir, drain_dir, s_net=s_net, d_net=d_net )&lt;br /&gt;
&lt;br /&gt;
    start_col  = 3 + pmos_nf + 2&lt;br /&gt;
    pmos1      = self.draw_mos_conn(mos_type, row, start_col, nf, source_dir, drain_dir, s_net=s_net, d_net=d_net )&lt;br /&gt;
       &lt;br /&gt;
    #==============================================&lt;br /&gt;
	# Routing proper&lt;br /&gt;
	#==============================================&lt;br /&gt;
&lt;br /&gt;
    # Gate routing&lt;br /&gt;
    tid_A_G     = self.make_track_id('nch', row_idx=0, tr_type='g', tr_idx=-2, width=1)&lt;br /&gt;
    gate_A_warr = self.connect_to_tracks([nmos0['g'],pmos0['g']], tid_A_G)&lt;br /&gt;
    self.add_pin(self.get_pin_name('A'), gate_A_warr, show=show_pins)&lt;br /&gt;
&lt;br /&gt;
    tid_B_G     = self.make_track_id('nch', row_idx=0, tr_type='g', tr_idx=-2, width=1)&lt;br /&gt;
    gate_B_warr = self.connect_to_tracks([nmos1['g'],pmos1['g']], tid_B_G)&lt;br /&gt;
    self.add_pin(self.get_pin_name('B'), gate_B_warr, show=show_pins)&lt;br /&gt;
&lt;br /&gt;
    # Drain routings&lt;br /&gt;
    tid_P_D      = self.make_track_id('pch', row_idx=0, tr_type='ds', tr_idx=0, width=1)&lt;br /&gt;
    drain_P_warr = self.connect_to_tracks([pmos0['d'], pmos1['d']], tid_P_D)&lt;br /&gt;
&lt;br /&gt;
    tid_N_D      = self.make_track_id('nch', row_idx=0, tr_type='ds', tr_idx=0, width=1)&lt;br /&gt;
    drain_N_warr = self.connect_to_tracks(nmos0['d'], tid_N_D)&lt;br /&gt;
&lt;br /&gt;
    # Setting a horizontal track&lt;br /&gt;
    # Get location of vertical track&lt;br /&gt;
    loc = (drain_N_warr.get_bbox_array(self.grid).left + drain_N_warr.get_bbox_array(self.grid).right/2)&lt;br /&gt;
    idx = self.grid.coord_to_nearest_track(layer_id=5, coord=loc)&lt;br /&gt;
&lt;br /&gt;
    # Vertical track to connect drains&lt;br /&gt;
    ver_id = TrackID(layer_id=5, track_idx=idx, width=1)&lt;br /&gt;
    out_warr = self.connect_to_tracks([drain_N_warr, drain_P_warr], ver_id)&lt;br /&gt;
    self.add_pin(self.get_pin_name('Q'), out_warr, show=show_pins)&lt;br /&gt;
&lt;br /&gt;
    # NMOS drain-source routing&lt;br /&gt;
    tid_N0_N1_DS = self.make_track_id('nch', row_idx=0, tr_type='ds', tr_idx=0, width=1)&lt;br /&gt;
    N0_N1_DS_warr = self.connect_to_tracks([nmos0['s'], nmos1['d']], tid_N0_N1_DS)&lt;br /&gt;
&lt;br /&gt;
    # Connection to VSS and VDD&lt;br /&gt;
    self.connect_to_substrate('ptap', nmos1['s'])&lt;br /&gt;
    self.connect_to_substrate('ntap', pmos0['s'])&lt;br /&gt;
    self.connect_to_substrate('ntap', pmos1['s'])&lt;br /&gt;
&lt;br /&gt;
    # Filling dummies and adding VDD and VSS pins&lt;br /&gt;
    ptap_wire_arrs, ntap_wire_arrs = self.fill_dummy(vss_width=6, vdd_width=6, lower=0, upper=self.bound_box.right)&lt;br /&gt;
    self.add_pin(self.get_pin_name('VDD'), ntap_wire_arrs, label='VDD',show=True)&lt;br /&gt;
    self.add_pin(self.get_pin_name('VSS'), ptap_wire_arrs, label='VSS',show=True)&lt;br /&gt;
&lt;br /&gt;
    # Create schematic parameters for update&lt;br /&gt;
    self.sch_params = dict()&lt;br /&gt;
    for key in ('lch', &lt;br /&gt;
            'tran_intent', &lt;br /&gt;
            'nmos_nf', &lt;br /&gt;
            'nmos_w', &lt;br /&gt;
            'pmos_nf', &lt;br /&gt;
            'pmos_w', &lt;br /&gt;
            'ntap_w', &lt;br /&gt;
            'ptap_w',&lt;br /&gt;
            'flip_well'&lt;br /&gt;
            ):&lt;br /&gt;
        self.sch_params[key] = self.params[key]&lt;br /&gt;
    &lt;br /&gt;
    sch_dummy_info = self.get_sch_dummy_info()&lt;br /&gt;
    self.sch_params['sch_dummy_info'] = sch_dummy_info&lt;br /&gt;
    self.sch_dummy_info=sch_dummy_info&lt;/div&gt;</summary>
		<author><name>Ryan Antonio</name></author>
	</entry>
</feed>