diff --git a/intermediate/klayoutrc/klayoutrc b/intermediate/klayoutrc/klayoutrc
new file mode 100644
index 00000000..286b684e
--- /dev/null
+++ b/intermediate/klayoutrc/klayoutrc
@@ -0,0 +1,1049 @@
+
+
+ false
+ false
+ 10
+ false
+ true
+
+ auto
+ true
+ 1
+ by-name
+ auto
+ 50
+ false
+ false
+
+ any-top
+ 1000
+ 1
+ fit-marker
+
+ 32
+ false
+ 255,157,157[0] 255,128,168[1] 192,128,255[2] 149,128,255[3] 128,134,255[4] 128,168,255[5] 255,0,0[6] 255,0,128[7] 255,0,255[8] 128,0,255[9] 0,0,255[10] 0,128,255[11] 128,0,0[12] 128,0,87[13] 128,0,128[14] 80,0,128[15] 0,0,128[16] 0,64,128[17] 128,255,251[18] 128,255,141[19] 175,255,128[20] 243,255,128[21] 255,194,128[22] 255,160,128[23] 0,255,255[24] 1,255,107[25] 145,255,0[26] 221,255,0[27] 255,174,0[28] 255,128,0[29] 0,128,128[30] 0,128,80[31] 0,128,0[32] 80,128,0[33] 128,128,0[34] 128,80,0[35] 255,255,255 192,192,192 128,128,128 96,96,96 64,64,64 0,0,0
+ add
+ auto
+ 50
+ false
+ -1
+ auto
+ false
+ 0
+
+ 0
+
+ false
+
+ false
+ 0
+ 0.01,0.005,0.001
+
+ 0.1
+ false
+ false
+ false
+ false
+ false
+ 2
+ 5
+ false
+ 1
+ false
+ 0
+ 10
+ any
+
+ -1
+ 0
+ false
+
+ 0.0
+ 0.0
+ 1
+ false
+
+ false
+ 0.0
+ 0.0
+ 1
+ 1.0
+ 1000
+ true
+ any
+ flush
+ 0.0
+ 0.0
+ 0.1
+ -1
+ false
+ '5/0',
+ true
+ true
+ false
+ left
+ 0
+ ABC
+ bottom
+ true
+ true
+ false
+ true
+ r0 *1 0,0
+ auto
+ auto
+ auto
+ 0.005
+ auto
+ true
+ invisible
+ dots
+ tenths-dotted-lines
+ true
+ auto
+ 1
+ 5
+ true
+ true
+ false
+ 1
+ true
+ 1
+ sg13g2
+ auto
+ 0
+ true
+ true
+ 0
+
+zoom_menu.zoom_fit:F;
+edit_menu.mode_menu.move:M;
+'@lcp_context_menu.show_only':'Shift+Tab';
+'@lcp_context_menu.show_all':Tab;
+'@lcp_context_menu.hide_empty_layers':H;
+edit_menu.mode_menu.box:W;
+edit_menu.mode_menu.partial:P;
+edit_menu.mode_menu.ruler:K;
+'@secrets.select_next_item':'';
+'@secrets.select_next_item_add':'';
+edit_menu.cancel:'';
+edit_menu.clear_all_rulers:'';
+edit_menu.copy:'';
+edit_menu.cut:'';
+edit_menu.delete:'';
+edit_menu.duplicate:'';
+edit_menu.edit_options:'';
+edit_menu.paste:'';
+edit_menu.redo:'';
+edit_menu.selection_menu.tap:'';
+edit_menu.show_properties:'';
+edit_menu.undo:'';
+file_menu.close:'';
+file_menu.close_all:'';
+file_menu.exit:'';
+file_menu.open_new_panel:'';
+file_menu.open_same_panel:'';
+file_menu.print:'';
+file_menu.reload:'';
+file_menu.screenshot:'';
+macros_menu.macro_development:'';
+zoom_menu.ascend:'';
+zoom_menu.dec_max_hier:'';
+zoom_menu.descend:'';
+zoom_menu.descend_into:'';
+zoom_menu.goto_position:'';
+zoom_menu.inc_max_hier:'';
+zoom_menu.max_hier:'';
+zoom_menu.max_hier_0:'';
+zoom_menu.max_hier_1:'';
+zoom_menu.select_current_cell:'';
+zoom_menu.zoom_fit_sel:'';
+zoom_menu.zoom_in:'';
+zoom_menu.zoom_out:'';
+'@@navigator_menu.navigator_main_menu.navigator_all_hier_levels':'';
+'@@navigator_menu.navigator_main_menu.navigator_freeze':'';
+'@@navigator_menu.navigator_main_menu.navigator_show_images':'';
+'@bookmarks_context_menu.follow_selection':'';
+'@bookmarks_context_menu.load_bookmarks':'';
+'@bookmarks_context_menu.manage_bookmarks':'';
+'@bookmarks_context_menu.save_bookmarks':'';
+'@hcp_context_menu.cell_user_properties':'';
+'@hcp_context_menu.copy':'';
+'@hcp_context_menu.cut':'';
+'@hcp_context_menu.delete_cell':'';
+'@hcp_context_menu.flat_mode':'';
+'@hcp_context_menu.flatten_cell':'';
+'@hcp_context_menu.hide_cell':'';
+'@hcp_context_menu.new_cell':'';
+'@hcp_context_menu.open_current':'';
+'@hcp_context_menu.paste':'';
+'@hcp_context_menu.rename_cell':'';
+'@hcp_context_menu.replace_cell':'';
+'@hcp_context_menu.save_cell_as':'';
+'@hcp_context_menu.show_all':'';
+'@hcp_context_menu.show_as_top':'';
+'@hcp_context_menu.show_cell':'';
+'@hcp_context_menu.sorting.by_area':'';
+'@hcp_context_menu.sorting.by_area_reverse':'';
+'@hcp_context_menu.sorting.by_name':'';
+'@hcp_context_menu.split_mode':'';
+'@lcp_context_menu.add_others':'';
+'@lcp_context_menu.clean_up':'';
+'@lcp_context_menu.copy':'';
+'@lcp_context_menu.cut':'';
+'@lcp_context_menu.del':'';
+'@lcp_context_menu.group':'';
+'@lcp_context_menu.hide':'';
+'@lcp_context_menu.hide_all':'';
+'@lcp_context_menu.insert':'';
+'@lcp_context_menu.invert_selection':'';
+'@lcp_context_menu.invvalid':'';
+'@lcp_context_menu.paste':'';
+'@lcp_context_menu.regroup_menu.flatten':'';
+'@lcp_context_menu.regroup_menu.grp_d':'';
+'@lcp_context_menu.regroup_menu.grp_i':'';
+'@lcp_context_menu.regroup_menu.grp_l':'';
+'@lcp_context_menu.rename':'';
+'@lcp_context_menu.select_all':'';
+'@lcp_context_menu.select_source':'';
+'@lcp_context_menu.show':'';
+'@lcp_context_menu.sort_menu.sort_dli':'';
+'@lcp_context_menu.sort_menu.sort_idl':'';
+'@lcp_context_menu.sort_menu.sort_ild':'';
+'@lcp_context_menu.sort_menu.sort_ldi':'';
+'@lcp_context_menu.sort_menu.sort_name':'';
+'@lcp_context_menu.tab_menu.new_tab':'';
+'@lcp_context_menu.tab_menu.remove_tab':'';
+'@lcp_context_menu.tab_menu.rename_tab':'';
+'@lcp_context_menu.test_shapes_in_view':'';
+'@lcp_context_menu.toggle_visibility':'';
+'@lcp_context_menu.ungroup':'';
+'@lcp_context_menu.valid':'';
+'@lcp_context_menu.visibility_follows_selection':'';
+'@lcp_tabs_context_menu.new_tab':'';
+'@lcp_tabs_context_menu.remove_tab':'';
+'@lcp_tabs_context_menu.rename_tab':'';
+'@secrets.duplicate_interactive':'';
+'@secrets.paste_interactive':'';
+'@secrets.sel_move_interactive':'';
+'@toolbar.combine_mode':'';
+'@toolbar.next_display_state':'';
+'@toolbar.prev_display_state':'';
+'@toolbar.technology_selector':'';
+bookmark_menu:'';
+bookmark_menu.bookmark_view:'';
+bookmark_menu.goto_bookmark_menu:'';
+bookmark_menu.load_bookmarks:'';
+bookmark_menu.manage_bookmarks:'';
+bookmark_menu.open_recent_menu_bookmarks:'';
+bookmark_menu.save_bookmarks:'';
+edit_menu:'';
+edit_menu.add_image:'';
+edit_menu.cell_menu:'';
+edit_menu.cell_menu.adjust_cell_origin:'';
+edit_menu.cell_menu.convert_cell_to_static:'';
+edit_menu.cell_menu.delete_cell:'';
+edit_menu.cell_menu.flatten_cell:'';
+edit_menu.cell_menu.new_cell:'';
+edit_menu.cell_menu.rename_cell:'';
+edit_menu.cell_menu.replace_cell:'';
+edit_menu.cell_menu.user_properties:'';
+edit_menu.configure_rulers:'';
+edit_menu.image_menu:'';
+edit_menu.image_menu.bring_to_back:'';
+edit_menu.image_menu.bring_to_front:'';
+edit_menu.image_menu.clear_all_images:'';
+edit_menu.layer_menu:'';
+edit_menu.layer_menu.boolean:'';
+edit_menu.layer_menu.clear_layer:'';
+edit_menu.layer_menu.copy_layer:'';
+edit_menu.layer_menu.delete_layer:'';
+edit_menu.layer_menu.edit_layer:'';
+edit_menu.layer_menu.merge:'';
+edit_menu.layer_menu.new_layer:'';
+edit_menu.layer_menu.size:'';
+edit_menu.layout_menu:'';
+edit_menu.layout_menu.lay_convert_to_static:'';
+edit_menu.layout_menu.lay_flip_x:'';
+edit_menu.layout_menu.lay_flip_y:'';
+edit_menu.layout_menu.lay_free_rot:'';
+edit_menu.layout_menu.lay_move:'';
+edit_menu.layout_menu.lay_rot_ccw:'';
+edit_menu.layout_menu.lay_rot_cw:'';
+edit_menu.layout_menu.lay_scale:'';
+edit_menu.mode_menu:'';
+edit_menu.mode_menu.instance:'';
+edit_menu.mode_menu.path:'';
+edit_menu.mode_menu.polygon:'';
+edit_menu.mode_menu.select:'';
+edit_menu.mode_menu.text:'';
+edit_menu.redo_list:'';
+edit_menu.search_replace_editor:'';
+edit_menu.select_menu:'';
+edit_menu.select_menu.disable_all:'';
+edit_menu.select_menu.enable_all:'';
+edit_menu.select_menu.pi_enable_13:'';
+edit_menu.select_menu.pi_enable_14:'';
+edit_menu.select_menu.pi_enable_15:'';
+edit_menu.select_menu.pi_enable_16:'';
+edit_menu.select_menu.pi_enable_17:'';
+edit_menu.select_menu.pi_enable_18:'';
+edit_menu.select_menu.pi_enable_20:'';
+edit_menu.select_menu.pi_enable_22:'';
+edit_menu.select_menu.pi_enable_23:'';
+edit_menu.select_menu.select_all:'';
+edit_menu.select_menu.unselect_all:'';
+edit_menu.selection_menu:'';
+edit_menu.selection_menu.align:'';
+edit_menu.selection_menu.area_perimeter:'';
+edit_menu.selection_menu.change_layer:'';
+edit_menu.selection_menu.convert_to_cell:'';
+edit_menu.selection_menu.convert_to_pcell:'';
+edit_menu.selection_menu.difference:'';
+edit_menu.selection_menu.distribute:'';
+edit_menu.selection_menu.flatten_insts:'';
+edit_menu.selection_menu.intersection:'';
+edit_menu.selection_menu.make_array:'';
+edit_menu.selection_menu.make_cell:'';
+edit_menu.selection_menu.make_cell_variants:'';
+edit_menu.selection_menu.move_hier_up:'';
+edit_menu.selection_menu.resolve_arefs:'';
+edit_menu.selection_menu.round_corners:'';
+edit_menu.selection_menu.sel_flip_x:'';
+edit_menu.selection_menu.sel_flip_y:'';
+edit_menu.selection_menu.sel_free_rot:'';
+edit_menu.selection_menu.sel_move:'';
+edit_menu.selection_menu.sel_move_to:'';
+edit_menu.selection_menu.sel_rot_ccw:'';
+edit_menu.selection_menu.sel_rot_cw:'';
+edit_menu.selection_menu.sel_scale:'';
+edit_menu.selection_menu.separate:'';
+edit_menu.selection_menu.size:'';
+edit_menu.selection_menu.union:'';
+edit_menu.undo_list:'';
+edit_menu.utils_menu:'';
+edit_menu.utils_menu.clip_tool:'';
+edit_menu.utils_menu.fill_tool:'';
+file_menu:'';
+file_menu.clone:'';
+file_menu.import_menu:'';
+file_menu.import_menu.import_def:'';
+file_menu.import_menu.import_gerber_menu:'';
+file_menu.import_menu.import_gerber_menu.import_gerber_new:'';
+file_menu.import_menu.import_gerber_menu.import_gerber_new_free:'';
+file_menu.import_menu.import_gerber_menu.import_gerber_open:'';
+file_menu.import_menu.import_gerber_menu.import_gerber_recent:'';
+file_menu.import_menu.import_lef:'';
+file_menu.import_menu.import_stream:'';
+file_menu.layout_props:'';
+file_menu.layout_stats:'';
+file_menu.load_layer_props:'';
+file_menu.new_layout:'';
+file_menu.new_panel:'';
+file_menu.open:'';
+file_menu.open_recent_menu:'';
+file_menu.open_recent_menu_layer_props:'';
+file_menu.open_recent_menu_sessions:'';
+file_menu.pull_in:'';
+file_menu.reader_options:'';
+file_menu.restore_session:'';
+file_menu.save:'';
+file_menu.save_all:'';
+file_menu.save_as:'';
+file_menu.save_layer_props:'';
+file_menu.save_session:'';
+file_menu.screenshot_to_clipboard:'';
+file_menu.setup:'';
+file_menu.view_log:'';
+file_menu.writer_options:'';
+help_menu:'';
+help_menu.about:'';
+help_menu.about_qt:'';
+help_menu.assistant:'';
+help_menu.show_all_tips:'';
+macros_menu:'';
+sg13g2_menu:'';
+sg13g2_menu.macro_in_menu_sg13g2_density_report:'';
+sg13g2_menu.macro_in_menu_sg13g2_filler_ActGatP:'';
+sg13g2_menu.macro_in_menu_sg13g2_filler_Metal:'';
+sg13g2_menu.macro_in_menu_sg13g2_filler_TopMetal:'';
+sg13g2_menu.macro_in_menu_sg13g2_lvs:'';
+sg13g2_menu.macro_in_menu_sg13g2_options:'';
+tools_menu:'';
+tools_menu.browse_instances:'';
+tools_menu.browse_markers:'';
+tools_menu.browse_netlists:'';
+tools_menu.browse_shapes:'';
+tools_menu.d25:'';
+tools_menu.d25.edit_script:'';
+tools_menu.d25.new_script:'';
+tools_menu.d25.open_window:'';
+tools_menu.diff_tool:'';
+tools_menu.drc:'';
+tools_menu.drc.edit_script:'';
+tools_menu.drc.macro_in_menu_sg13g2_maximal:'';
+tools_menu.drc.macro_in_menu_sg13g2_minimal:'';
+tools_menu.drc.new_script:'';
+tools_menu.edit_layer_stack:'';
+tools_menu.lvs:'';
+tools_menu.lvs.edit_script:'';
+tools_menu.lvs.macro_in_menu_sg13g2_full:'';
+tools_menu.lvs.new_script:'';
+tools_menu.net_trace:'';
+tools_menu.packages:'';
+tools_menu.shapes_to_markers:'';
+tools_menu.shapes_to_markers.scan_layers:'';
+tools_menu.shapes_to_markers.scan_layers_flat:'';
+tools_menu.technologies:'';
+tools_menu.trace_all_nets_menu:'';
+tools_menu.trace_all_nets_menu.trace_all_nets:'';
+tools_menu.trace_all_nets_menu.trace_all_nets_flat:'';
+tools_menu.xor_tool:'';
+view_menu:'';
+view_menu.crosshair_cursor:'';
+view_menu.default_grid:'';
+view_menu.default_grid.default_grid_1:'';
+view_menu.default_grid.default_grid_2:'';
+view_menu.edit_top_level_selection:'';
+view_menu.mouse_tracking:'';
+view_menu.no_stipples:'';
+view_menu.reset_window_state:'';
+view_menu.show_bookmarks_view:'';
+view_menu.show_cell_boxes:'';
+view_menu.show_grid:'';
+view_menu.show_hierarchy_panel:'';
+view_menu.show_images:'';
+view_menu.show_layer_panel:'';
+view_menu.show_layer_toolbox:'';
+view_menu.show_libraries_view:'';
+view_menu.show_markers:'';
+view_menu.show_navigator:'';
+view_menu.show_texts:'';
+view_menu.show_toolbar:'';
+view_menu.synchronized_views:'';
+view_menu.transient_selection:'';
+zoom_menu:'';
+zoom_menu.global_trans:'';
+zoom_menu.global_trans.m0:'';
+zoom_menu.global_trans.m135:'';
+zoom_menu.global_trans.m45:'';
+zoom_menu.global_trans.m90:'';
+zoom_menu.global_trans.r0:'';
+zoom_menu.global_trans.r180:'';
+zoom_menu.global_trans.r270:'';
+zoom_menu.global_trans.r90:'';
+zoom_menu.next_display_state:'';
+zoom_menu.prev_display_state:'';
+zoom_menu.redraw:'';
+zoom_menu.select_cell:'';
+file_menu.open_recent_menu.clear_recent:'';
+file_menu.open_recent_menu.open_recent_1:'';
+file_menu.open_recent_menu.open_recent_2:''
+
+ CIRCUIT_
+ DEVICE_
+ NET_
+
+ false
+ false
+ 1000
+ auto
+ 255,0,0 0,255,0 0,0,255 255,255,0 255,0,255 0,255,255 160,80,255 255,160,0
+ false
+ -1
+ -1
+ 50
+ -1
+ false
+ -1
+ 10000
+ true
+ 1
+ fit-net
+
+ false
+ false
+ true
+ false
+ true
+
+ 0 1 2 3
+
+
+
+
+ true
+ true
+ DejaVu Sans Mono
+ 11
+
+ 2
+
+ false
+ true
+ basic:'Alert'=(bold:true,color:'#bf0303',background:'#f7e7e7'),'Attribute'=(color:'#0057ae'),'Base-N Integer'=(color:'#b07e00'),'Built-in'=(bold:true,color:'#644a9b'),'Character'=(color:'#ff80e0'),'Comment'=(italic:true,color:'#888786'),'Control Flow'=(bold:true,color:'#1f1c1b'),'Data Type'=(color:'#0057ae'),'Decimal/Value'=(color:'#b07e00'),'Error'=(color:'#bf0303'),'Extension'=(color:'#0095ff'),'Floating Point'=(color:'#b07e00'),'Function'=(color:'#442886'),'Import'=(color:'#ff5500'),'Keyword'=(bold:true),'Normal'=(),'Operator'=(color:'#1f1c1b'),'Others'=(color:'#006e26'),'Preprocessor'=(color:'#006e28'),'Region Marker'=(color:'#0057ae',background:'#e1eaf8'),'Special Character'=(color:'#3daee9'),'Special String'=(color:'#ff5500'),'String'=(color:'#bf0303'),'Variable'=(color:'#0057ae'),'Verbatim String'=(color:'#bf0303');ruby:'Access Control'=(color:'#0000ff'),'Attribute Definition'=(),'Bin'=(),'Blockcomment'=(),'Char'=(),'Class Variable'=(),'Command'=(color:'#aa3000'),'Comment'=(),'Constant'=(),'Constant Value'=(color:'#bb1188'),'Data'=(),'Dec'=(),'Default globals'=(bold:true,color:'#c00000'),'Definition'=(),'Delimiter'=(color:'#ff9fec'),'Error'=(),'Expression'=(),'Float'=(),'GDL input'=(),'Global Constant'=(bold:true,color:'#bb1188'),'Global Variable'=(color:'#c00000'),'Here Document'=(),'Hex'=(),'Instance Variable'=(),'Kernel methods'=(color:'#000080'),'Keyword'=(),'Member'=(),'Message'=(color:'#4000a7'),'Module mixin methods'=(color:'#000080'),'Normal Text'=(),'Octal'=(),'Operator'=(color:'#ff9fec'),'Pseudo variable'=(),'RDoc Value'=(),'Raw String'=(color:'#dd4a4a'),'Region Marker'=(color:'#0000ff'),'Regular Expression'=(color:'#4a5704'),'String'=(),'Substitution'=(),'Symbol'=(color:'#d40000');python:'Builtin Function'=(),'ClassNames'=(italic:false,bold:true,color:'#fcad3d'),'Comment'=(),'Complex'=(),'Decorator'=(),'Definition Keyword'=(),'Error'=(),'Exceptions'=(),'Extensions'=(),'F-String'=(),'Float'=(),'Flow Control Keyword'=(),'Hex'=(),'Import'=(),'Int'=(),'Normal Text'=(),'Octal'=(),'Operator'=(),'Operator Keyword'=(),'Overloaders'=(),'Raw F-String'=(),'Raw String'=(),'Special Variable'=(),'String'=(),'String Char'=(),'String Substitution'=();
+ 8
+
+
+ true
+
+'@@navigator_menu.navigator_main_menu.navigator_all_hier_levels':false;
+'@@navigator_menu.navigator_main_menu.navigator_freeze':false;
+'@@navigator_menu.navigator_main_menu.navigator_show_images':false;
+'@bookmarks_context_menu.follow_selection':false;
+'@bookmarks_context_menu.load_bookmarks':false;
+'@bookmarks_context_menu.manage_bookmarks':false;
+'@bookmarks_context_menu.save_bookmarks':false;
+'@hcp_context_menu.cell_user_properties':false;
+'@hcp_context_menu.copy':false;
+'@hcp_context_menu.cut':false;
+'@hcp_context_menu.delete_cell':false;
+'@hcp_context_menu.flat_mode':false;
+'@hcp_context_menu.flatten_cell':false;
+'@hcp_context_menu.hide_cell':false;
+'@hcp_context_menu.new_cell':false;
+'@hcp_context_menu.open_current':false;
+'@hcp_context_menu.paste':false;
+'@hcp_context_menu.rename_cell':false;
+'@hcp_context_menu.replace_cell':false;
+'@hcp_context_menu.save_cell_as':false;
+'@hcp_context_menu.show_all':false;
+'@hcp_context_menu.show_as_top':false;
+'@hcp_context_menu.show_cell':false;
+'@hcp_context_menu.sorting.by_area':false;
+'@hcp_context_menu.sorting.by_area_reverse':false;
+'@hcp_context_menu.sorting.by_name':false;
+'@hcp_context_menu.split_mode':false;
+'@lcp_context_menu.add_others':false;
+'@lcp_context_menu.clean_up':false;
+'@lcp_context_menu.copy':false;
+'@lcp_context_menu.cut':false;
+'@lcp_context_menu.del':false;
+'@lcp_context_menu.group':false;
+'@lcp_context_menu.hide':false;
+'@lcp_context_menu.hide_all':false;
+'@lcp_context_menu.hide_empty_layers':false;
+'@lcp_context_menu.insert':false;
+'@lcp_context_menu.invert_selection':false;
+'@lcp_context_menu.invvalid':false;
+'@lcp_context_menu.paste':false;
+'@lcp_context_menu.regroup_menu.flatten':false;
+'@lcp_context_menu.regroup_menu.grp_d':false;
+'@lcp_context_menu.regroup_menu.grp_i':false;
+'@lcp_context_menu.regroup_menu.grp_l':false;
+'@lcp_context_menu.rename':false;
+'@lcp_context_menu.select_all':false;
+'@lcp_context_menu.select_source':false;
+'@lcp_context_menu.show':false;
+'@lcp_context_menu.show_all':false;
+'@lcp_context_menu.show_only':false;
+'@lcp_context_menu.sort_menu.sort_dli':false;
+'@lcp_context_menu.sort_menu.sort_idl':false;
+'@lcp_context_menu.sort_menu.sort_ild':false;
+'@lcp_context_menu.sort_menu.sort_ldi':false;
+'@lcp_context_menu.sort_menu.sort_name':false;
+'@lcp_context_menu.tab_menu.new_tab':false;
+'@lcp_context_menu.tab_menu.remove_tab':false;
+'@lcp_context_menu.tab_menu.rename_tab':false;
+'@lcp_context_menu.test_shapes_in_view':false;
+'@lcp_context_menu.toggle_visibility':false;
+'@lcp_context_menu.ungroup':false;
+'@lcp_context_menu.valid':false;
+'@lcp_context_menu.visibility_follows_selection':false;
+'@lcp_tabs_context_menu.new_tab':false;
+'@lcp_tabs_context_menu.remove_tab':false;
+'@lcp_tabs_context_menu.rename_tab':false;
+'@secrets.duplicate_interactive':false;
+'@secrets.paste_interactive':false;
+'@secrets.sel_move_interactive':false;
+'@secrets.select_next_item':false;
+'@secrets.select_next_item_add':false;
+'@toolbar.combine_mode':false;
+'@toolbar.next_display_state':false;
+'@toolbar.prev_display_state':false;
+'@toolbar.technology_selector':false;
+bookmark_menu:false;
+bookmark_menu.bookmark_view:false;
+bookmark_menu.goto_bookmark_menu:false;
+bookmark_menu.load_bookmarks:false;
+bookmark_menu.manage_bookmarks:false;
+bookmark_menu.open_recent_menu_bookmarks:false;
+bookmark_menu.save_bookmarks:false;
+edit_menu:false;
+edit_menu.add_image:false;
+edit_menu.cancel:false;
+edit_menu.cell_menu:false;
+edit_menu.cell_menu.adjust_cell_origin:false;
+edit_menu.cell_menu.convert_cell_to_static:false;
+edit_menu.cell_menu.delete_cell:false;
+edit_menu.cell_menu.flatten_cell:false;
+edit_menu.cell_menu.new_cell:false;
+edit_menu.cell_menu.rename_cell:false;
+edit_menu.cell_menu.replace_cell:false;
+edit_menu.cell_menu.user_properties:false;
+edit_menu.clear_all_rulers:false;
+edit_menu.configure_rulers:false;
+edit_menu.copy:false;
+edit_menu.cut:false;
+edit_menu.delete:false;
+edit_menu.duplicate:false;
+edit_menu.edit_options:false;
+edit_menu.image_menu:false;
+edit_menu.image_menu.bring_to_back:false;
+edit_menu.image_menu.bring_to_front:false;
+edit_menu.image_menu.clear_all_images:false;
+edit_menu.layer_menu:false;
+edit_menu.layer_menu.boolean:false;
+edit_menu.layer_menu.clear_layer:false;
+edit_menu.layer_menu.copy_layer:false;
+edit_menu.layer_menu.delete_layer:false;
+edit_menu.layer_menu.edit_layer:false;
+edit_menu.layer_menu.merge:false;
+edit_menu.layer_menu.new_layer:false;
+edit_menu.layer_menu.size:false;
+edit_menu.layout_menu:false;
+edit_menu.layout_menu.lay_convert_to_static:false;
+edit_menu.layout_menu.lay_flip_x:false;
+edit_menu.layout_menu.lay_flip_y:false;
+edit_menu.layout_menu.lay_free_rot:false;
+edit_menu.layout_menu.lay_move:false;
+edit_menu.layout_menu.lay_rot_ccw:false;
+edit_menu.layout_menu.lay_rot_cw:false;
+edit_menu.layout_menu.lay_scale:false;
+edit_menu.mode_menu:false;
+edit_menu.mode_menu.box:false;
+edit_menu.mode_menu.instance:false;
+edit_menu.mode_menu.move:false;
+edit_menu.mode_menu.partial:false;
+edit_menu.mode_menu.path:false;
+edit_menu.mode_menu.polygon:false;
+edit_menu.mode_menu.ruler:false;
+edit_menu.mode_menu.select:false;
+edit_menu.mode_menu.text:false;
+edit_menu.paste:false;
+edit_menu.redo:false;
+edit_menu.redo_list:false;
+edit_menu.search_replace_editor:false;
+edit_menu.select_menu:false;
+edit_menu.select_menu.disable_all:false;
+edit_menu.select_menu.enable_all:false;
+edit_menu.select_menu.pi_enable_13:false;
+edit_menu.select_menu.pi_enable_14:false;
+edit_menu.select_menu.pi_enable_15:false;
+edit_menu.select_menu.pi_enable_16:false;
+edit_menu.select_menu.pi_enable_17:false;
+edit_menu.select_menu.pi_enable_18:false;
+edit_menu.select_menu.pi_enable_20:false;
+edit_menu.select_menu.pi_enable_22:false;
+edit_menu.select_menu.pi_enable_23:false;
+edit_menu.select_menu.select_all:false;
+edit_menu.select_menu.unselect_all:false;
+edit_menu.selection_menu:false;
+edit_menu.selection_menu.align:false;
+edit_menu.selection_menu.area_perimeter:false;
+edit_menu.selection_menu.change_layer:false;
+edit_menu.selection_menu.convert_to_cell:false;
+edit_menu.selection_menu.convert_to_pcell:false;
+edit_menu.selection_menu.difference:false;
+edit_menu.selection_menu.distribute:false;
+edit_menu.selection_menu.flatten_insts:false;
+edit_menu.selection_menu.intersection:false;
+edit_menu.selection_menu.make_array:false;
+edit_menu.selection_menu.make_cell:false;
+edit_menu.selection_menu.make_cell_variants:false;
+edit_menu.selection_menu.move_hier_up:false;
+edit_menu.selection_menu.resolve_arefs:false;
+edit_menu.selection_menu.round_corners:false;
+edit_menu.selection_menu.sel_flip_x:false;
+edit_menu.selection_menu.sel_flip_y:false;
+edit_menu.selection_menu.sel_free_rot:false;
+edit_menu.selection_menu.sel_move:false;
+edit_menu.selection_menu.sel_move_to:false;
+edit_menu.selection_menu.sel_rot_ccw:false;
+edit_menu.selection_menu.sel_rot_cw:false;
+edit_menu.selection_menu.sel_scale:false;
+edit_menu.selection_menu.separate:false;
+edit_menu.selection_menu.size:false;
+edit_menu.selection_menu.tap:false;
+edit_menu.selection_menu.union:false;
+edit_menu.show_properties:false;
+edit_menu.undo:false;
+edit_menu.undo_list:false;
+edit_menu.utils_menu:false;
+edit_menu.utils_menu.clip_tool:false;
+edit_menu.utils_menu.fill_tool:false;
+file_menu:false;
+file_menu.clone:false;
+file_menu.close:false;
+file_menu.close_all:false;
+file_menu.exit:false;
+file_menu.import_menu:false;
+file_menu.import_menu.import_def:false;
+file_menu.import_menu.import_gerber_menu:false;
+file_menu.import_menu.import_gerber_menu.import_gerber_new:false;
+file_menu.import_menu.import_gerber_menu.import_gerber_new_free:false;
+file_menu.import_menu.import_gerber_menu.import_gerber_open:false;
+file_menu.import_menu.import_gerber_menu.import_gerber_recent:false;
+file_menu.import_menu.import_lef:false;
+file_menu.import_menu.import_stream:false;
+file_menu.layout_props:false;
+file_menu.layout_stats:false;
+file_menu.load_layer_props:false;
+file_menu.new_layout:false;
+file_menu.new_panel:false;
+file_menu.open:false;
+file_menu.open_new_panel:false;
+file_menu.open_recent_menu:false;
+file_menu.open_recent_menu_layer_props:false;
+file_menu.open_recent_menu_sessions:false;
+file_menu.open_same_panel:false;
+file_menu.print:false;
+file_menu.pull_in:false;
+file_menu.reader_options:false;
+file_menu.reload:false;
+file_menu.restore_session:false;
+file_menu.save:false;
+file_menu.save_all:false;
+file_menu.save_as:false;
+file_menu.save_layer_props:false;
+file_menu.save_session:false;
+file_menu.screenshot:false;
+file_menu.screenshot_to_clipboard:false;
+file_menu.setup:false;
+file_menu.view_log:false;
+file_menu.writer_options:false;
+help_menu:false;
+help_menu.about:false;
+help_menu.about_qt:false;
+help_menu.assistant:false;
+help_menu.show_all_tips:false;
+macros_menu:false;
+macros_menu.macro_development:false;
+sg13g2_menu:false;
+sg13g2_menu.macro_in_menu_sg13g2_density_report:false;
+sg13g2_menu.macro_in_menu_sg13g2_filler_ActGatP:false;
+sg13g2_menu.macro_in_menu_sg13g2_filler_Metal:false;
+sg13g2_menu.macro_in_menu_sg13g2_filler_TopMetal:false;
+sg13g2_menu.macro_in_menu_sg13g2_lvs:false;
+sg13g2_menu.macro_in_menu_sg13g2_options:false;
+tools_menu:false;
+tools_menu.browse_instances:false;
+tools_menu.browse_markers:false;
+tools_menu.browse_netlists:false;
+tools_menu.browse_shapes:false;
+tools_menu.d25:false;
+tools_menu.d25.edit_script:false;
+tools_menu.d25.new_script:false;
+tools_menu.d25.open_window:false;
+tools_menu.diff_tool:false;
+tools_menu.drc:false;
+tools_menu.drc.edit_script:false;
+tools_menu.drc.macro_in_menu_sg13g2_maximal:false;
+tools_menu.drc.macro_in_menu_sg13g2_minimal:false;
+tools_menu.drc.new_script:false;
+tools_menu.edit_layer_stack:false;
+tools_menu.lvs:false;
+tools_menu.lvs.edit_script:false;
+tools_menu.lvs.macro_in_menu_sg13g2_full:false;
+tools_menu.lvs.new_script:false;
+tools_menu.net_trace:false;
+tools_menu.packages:false;
+tools_menu.shapes_to_markers:false;
+tools_menu.shapes_to_markers.scan_layers:false;
+tools_menu.shapes_to_markers.scan_layers_flat:false;
+tools_menu.technologies:false;
+tools_menu.trace_all_nets_menu:false;
+tools_menu.trace_all_nets_menu.trace_all_nets:false;
+tools_menu.trace_all_nets_menu.trace_all_nets_flat:false;
+tools_menu.xor_tool:false;
+view_menu:false;
+view_menu.crosshair_cursor:false;
+view_menu.default_grid:false;
+view_menu.default_grid.default_grid_1:false;
+view_menu.default_grid.default_grid_2:false;
+view_menu.edit_top_level_selection:false;
+view_menu.mouse_tracking:false;
+view_menu.no_stipples:false;
+view_menu.reset_window_state:false;
+view_menu.show_bookmarks_view:false;
+view_menu.show_cell_boxes:false;
+view_menu.show_grid:false;
+view_menu.show_hierarchy_panel:false;
+view_menu.show_images:false;
+view_menu.show_layer_panel:false;
+view_menu.show_layer_toolbox:false;
+view_menu.show_libraries_view:false;
+view_menu.show_markers:false;
+view_menu.show_navigator:false;
+view_menu.show_texts:false;
+view_menu.show_toolbar:false;
+view_menu.synchronized_views:false;
+view_menu.transient_selection:false;
+zoom_menu:false;
+zoom_menu.ascend:false;
+zoom_menu.dec_max_hier:false;
+zoom_menu.descend:false;
+zoom_menu.descend_into:false;
+zoom_menu.global_trans:false;
+zoom_menu.global_trans.m0:false;
+zoom_menu.global_trans.m135:false;
+zoom_menu.global_trans.m45:false;
+zoom_menu.global_trans.m90:false;
+zoom_menu.global_trans.r0:false;
+zoom_menu.global_trans.r180:false;
+zoom_menu.global_trans.r270:false;
+zoom_menu.global_trans.r90:false;
+zoom_menu.goto_position:false;
+zoom_menu.inc_max_hier:false;
+zoom_menu.max_hier:false;
+zoom_menu.max_hier_0:false;
+zoom_menu.max_hier_1:false;
+zoom_menu.next_display_state:false;
+zoom_menu.prev_display_state:false;
+zoom_menu.redraw:false;
+zoom_menu.select_cell:false;
+zoom_menu.select_current_cell:false;
+zoom_menu.zoom_fit:false;
+zoom_menu.zoom_fit_sel:false;
+zoom_menu.zoom_in:false;
+zoom_menu.zoom_out:false;
+file_menu.open_recent_menu.clear_recent:false;
+file_menu.open_recent_menu.open_recent_1:false;
+file_menu.open_recent_menu.open_recent_2:false
+
+ 16
+ 0
+
+
+
+ false
+ true
+ false
+ auto
+ 255,0,0 0,255,0 0,0,255 255,255,0 255,0,255 0,255,255 160,80,255 255,160,0
+ false
+ -1
+ -1
+ 50
+ -1
+ -1
+ 10000
+ 1
+ fit-net
+ 0.15
+ 2
+
+ database-top
+ auto
+ -1
+ -1
+ -1
+ -1
+ 1000
+
+ 1
+ fit-marker
+
+ false
+ auto
+ false
+ true
+ true
+ any
+ 8
+ mode=normal,title=Ruler,category=_ruler,version=1,fmt=$D,fmt_x=$X,fmt_y=$Y,position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=ruler,outline=diag,snap=true,angle_constraint=global;mode=multi_segment,title='Multi-ruler',category=_multi_ruler,version=1,fmt=$D,fmt_x=$X,fmt_y=$Y,position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=ruler,outline=diag,snap=true,angle_constraint=global;mode=single_click,title=Cross,category=_cross,version=1,fmt='$U,$V',fmt_x='',fmt_y='',position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=cross_both,outline=diag,snap=true,angle_constraint=global;mode=auto_metric,title=Measure,category=_measure,version=1,fmt=$D,fmt_x=$X,fmt_y=$Y,position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=ruler,outline=diag,snap=true,angle_constraint=global;mode=auto_metric_edge,title='Measure edge',category=_measure_edge,version=1,fmt=$D,fmt_x=$X,fmt_y=$Y,position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=ruler,outline=diag,snap=true,angle_constraint=global;mode=angle,title=Angle,category=_angle,version=1,fmt='$(sprintf(\'%.5g\',G))\302\260',fmt_x='',fmt_y='',position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=line,outline=angle,snap=true,angle_constraint=any;mode=angle,title=Radius,category=_radius,version=1,fmt='R=$D',fmt_x='',fmt_y='',position=center,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=arrow_end,outline=radius,snap=true,angle_constraint=any;mode=normal,title=Ellipse,category='',version=1,fmt='',fmt_x='W=$(abs(X))',fmt_y='H=$(abs(Y))',position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=line,outline=ellipse,snap=true,angle_constraint=any;mode=normal,title=Box,category='',version=1,fmt='',fmt_x='W=$(abs(X))',fmt_y='H=$(abs(Y))',position=auto,xalign=auto,yalign=auto,xlabel_xalign=auto,xlabel_yalign=auto,ylabel_xalign=auto,ylabel_yalign=auto,style=line,outline=box,snap=true,angle_constraint=any
+ -1
+
+ 5
+ 0
+ auto
+ 1
+ true
+ false
+ 0
+ 1
+ true
+ 3
+
+ any-top
+ 1000
+ 1000
+ 1
+ fit-marker
+
+ false
+ true
+ true
+ true
+ true
+ false
+ false
+ true
+ false
+ false
+ 1000
+ 1
+ fit-marker
+
+ true
+ 0 1 2 3 4 5[1] 6 7 8 9[0] 10 11 12 13 14 15
+ <?xml version="1.0" encoding="utf-8"?>
+<stream-import-data>
+ <files>
+/file>
+ </files>
+ <cell-name/>
+ <layer-offset/>
+ <layer-mode>original</layer-mode>
+ <import-mode>merge</import-mode>
+ <reference-points>
+ </reference-points>
+ <explicit-trans>r0 *1 0,0</explicit-trans>
+ <options>
+ <gds2>
+ <box-mode>1</box-mode>
+ <allow-big-records>true</allow-big-records>
+ <allow-multi-xy-records>true</allow-multi-xy-records>
+ </gds2>
+ <common>
+ <create-other-layers>true</create-other-layers>
+ <layer-map>layer_map()</layer-map>
+ <enable-properties>true</enable-properties>
+ <enable-text-objects>true</enable-text-objects>
+ </common>
+ <lefdef>
+ <read-all-layers>true</read-all-layers>
+ <layer-map>layer_map()</layer-map>
+ <dbu>0.001</dbu>
+ <produce-net-names>true</produce-net-names>
+ <net-property-name>#1</net-property-name>
+ <produce-inst-names>true</produce-inst-names>
+ <inst-property-name>#1</inst-property-name>
+ <produce-pin-names>false</produce-pin-names>
+ <pin-property-name>#1</pin-property-name>
+ <produce-cell-outlines>true</produce-cell-outlines>
+ <cell-outline-layer>OUTLINE</cell-outline-layer>
+ <produce-placement-blockages>true</produce-placement-blockages>
+ <placement-blockage-layer>PLACEMENT_BLK</placement-blockage-layer>
+ <produce-regions>true</produce-regions>
+ <region-layer>REGIONS</region-layer>
+ <produce-via-geometry>true</produce-via-geometry>
+ <via_geometry-suffix-string/>
+ <via_geometry-datatype-string>0</via_geometry-datatype-string>
+ <produce-pins>true</produce-pins>
+ <pins-suffix-string>.PIN</pins-suffix-string>
+ <pins-datatype-string>2</pins-datatype-string>
+ <produce-lef-pins>true</produce-lef-pins>
+ <lef_pins-suffix-string>.PIN</lef_pins-suffix-string>
+ <lef_pins-datatype-string>2</lef_pins-datatype-string>
+ <produce-fills>true</produce-fills>
+ <fills-suffix-string>.FILL</fills-suffix-string>
+ <fills-datatype-string>5</fills-datatype-string>
+ <produce-obstructions>true</produce-obstructions>
+ <obstructions-suffix>.OBS</obstructions-suffix>
+ <obstructions-datatype>3</obstructions-datatype>
+ <produce-blockages>true</produce-blockages>
+ <blockages-suffix>.BLK</blockages-suffix>
+ <blockages-datatype>4</blockages-datatype>
+ <produce-labels>true</produce-labels>
+ <labels-suffix>.LABEL</labels-suffix>
+ <labels-datatype>1</labels-datatype>
+ <produce-lef-labels>true</produce-lef-labels>
+ <lef-labels-suffix>.LABEL</lef-labels-suffix>
+ <lef-labels-datatype>1</lef-labels-datatype>
+ <produce-routing>true</produce-routing>
+ <routing-suffix-string/>
+ <routing-datatype-string>0</routing-datatype-string>
+ <produce-special-routing>true</produce-special-routing>
+ <special-routing-suffix-string/>
+ <special-routing-datatype-string>0</special-routing-datatype-string>
+ <via-cellname-prefix>VIA_</via-cellname-prefix>
+ <read-lef-with-def>true</read-lef-with-def>
+ <macro-resolution-mode>default</macro-resolution-mode>
+ <separate-groups>false</separate-groups>
+ <joined-paths>false</joined-paths>
+ <map-file/>
+ </lefdef>
+ <mebes>
+ <invert>false</invert>
+ <subresolution>true</subresolution>
+ <produce-boundary>true</produce-boundary>
+ <num-stripes-per-cell>64</num-stripes-per-cell>
+ <num-shapes-per-cell>0</num-shapes-per-cell>
+ <data-layer>1</data-layer>
+ <data-datatype>0</data-datatype>
+ <data-name>DATA</data-name>
+ <boundary-layer>0</boundary-layer>
+ <boundary-datatype>0</boundary-datatype>
+ <boundary-name>BORDER</boundary-name>
+ <layer-map>layer_map()</layer-map>
+ <create-other-layers>true</create-other-layers>
+ </mebes>
+ <dxf>
+ <dbu>0.001</dbu>
+ <unit>1</unit>
+ <text-scaling>100</text-scaling>
+ <circle-points>100</circle-points>
+ <circle-accuracy>0</circle-accuracy>
+ <contour-accuracy>0</contour-accuracy>
+ <polyline-mode>0</polyline-mode>
+ <render-texts-as-polygons>false</render-texts-as-polygons>
+ <keep-other-cells>false</keep-other-cells>
+ <keep-layer-names>false</keep-layer-names>
+ <create-other-layers>true</create-other-layers>
+ <layer-map>layer_map()</layer-map>
+ </dxf>
+ <cif>
+ <wire-mode>0</wire-mode>
+ <dbu>0.001</dbu>
+ <layer-map>layer_map()</layer-map>
+ <create-other-layers>true</create-other-layers>
+ <keep-layer-names>false</keep-layer-names>
+ </cif>
+ <mag>
+ <lambda>1</lambda>
+ <dbu>0.001</dbu>
+ <layer-map>layer_map()</layer-map>
+ <create-other-layers>true</create-other-layers>
+ <keep-layer-names>false</keep-layer-names>
+ <merge>true</merge>
+ <lib-paths>
+ </lib-paths>
+ </mag>
+ </options>
+</stream-import-data>
+
+ false
+ false
+
+
+ false
+ auto
+ 0
+ true
+ false
+ true
+
+ auto
+ true
+ auto
+ -1
+ false
+ -1
+ 1
+ 0
+ AdnQywADAAAAAABCAAAAIAAAB38AAAPwAAACcQAAAEUAAAWQAAACnAAAAAACAAAAB4AAAABCAAAARQAAB38AAAPw
+ AAAA/wAAAAD9AAAAAgAAAAAAAADBAAAB6vwCAAAABPsAAAAqAG4AYQB2AGkAZwBhAHQAbwByAF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AAAAAAD/////AAAAkwD////7AAAAHABoAHAAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAAAVgAAAPIAAAAVAP////sAAAAgAGwAaQBiAHMAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQBAAABTgAAAPIAAAAVAP////sAAAAcAGUAbwBfAGQAbwBjAGsAXwB3AGkAZABnAGUAdAAAAAL+AAAAlgAAAJYA////AAAAAQAAALcAAAHq/AIAAAAD+wAAACoAYgBvAG8AawBtAGEAcgBrAHMAXwBkAG8AYwBrAF8AdwBpAGQAZwBlAHQAAAAAAP////8AAAAVAP////sAAAAcAGwAcABfAGQAbwBjAGsAXwB3AGkAZABnAGUAdAEAAABWAAABhwAAABUA////+wAAABwAbAB0AF8AZABvAGMAawBfAHcAaQBkAGcAZQB0AQAAAeMAAABdAAAAFQD///8AAAGcAAAB6gAAAAQAAAAEAAAACAAAAAj8AAAAAQAAAAIAAAABAAAADgB0AG8AbwBsAGIAYQByAQAAAAD/////AAAAAAAAAAA=
+ false
+ true
+ false
+ all
+
+ 1
+ rdb
+ all
+ false
+
+
+
diff --git a/intermediate/xschemrc/xschemrc b/intermediate/xschemrc/xschemrc
new file mode 100644
index 00000000..1d6599cd
--- /dev/null
+++ b/intermediate/xschemrc/xschemrc
@@ -0,0 +1,827 @@
+#### xschemrc system configuration file
+
+#### values may be overridden by user's ~/.xschem/xschemrc configuration file
+#### or by project-local ./xschemrc
+
+###########################################################################
+#### XSCHEM INSTALLATION DIRECTORY: XSCHEM_SHAREDIR
+###########################################################################
+#### Normally there is no reason to set this variable if using standard
+#### installation. Location of files is set at compile time but may be overridden
+#### with following line:
+# set XSCHEM_SHAREDIR $env(HOME)/share/xschem
+
+###########################################################################
+#### XSCHEM SYSTEM-WIDE DESIGN LIBRARY PATHS: XSCHEM_LIBRARY_PATH
+###########################################################################
+#### If unset xschem starts with XSCHEM_LIBRARY_PATH set to the default, typically:
+# ${HOME}/.xschem/xschem_library
+# /share/xschem/xschem_library/devices
+# /share/doc/xschem/examples
+# /share/doc/xschem/ngspice
+# /share/doc/xschem/logic
+# /share/doc/xschem/xschem_simulator
+# /share/doc/xschem/binto7seg
+# /share/doc/xschem/pcb
+# /share/doc/xschem/rom8k
+
+#### Flush any previous definition
+set XSCHEM_LIBRARY_PATH {}
+#### include devices/*.sym
+append XSCHEM_LIBRARY_PATH :${XSCHEM_SHAREDIR}/xschem_library/devices
+append XSCHEM_LIBRARY_PATH :${XSCHEM_SHAREDIR}/xschem_library
+#### include skywater libraries. Here i use [pwd]. This works if i start xschem from here.
+append XSCHEM_LIBRARY_PATH :[file dirname [info script]]
+#### add ~/.xschem/xschem_library (USER_CONF_DIR is normally ~/.xschem)
+append XSCHEM_LIBRARY_PATH :$USER_CONF_DIR/xschem_library
+
+###########################################################################
+#### SET CUSTOM COLORS FOR XSCHEM LIBRARIES MATCHING CERTAIN PATTERNS
+###########################################################################
+#### each line contains a dircolor(pattern) followed by a color
+#### color can be an ordinary name (grey, brown, blue) or a hex code {#77aaff}
+#### hex code must be enclosed in braces
+array unset dircolor
+set dircolor(sg13g2_pr$) blue
+set dircolor(sg13g2_tests$) blue
+set dircolor(xschem_library$) red
+set dircolor(devices$) red
+
+###########################################################################
+#### DIRECTORY WHERE SIMULATIONS, NETLIST AND SIMULATOR OUTPUTS ARE PLACED
+###########################################################################
+#### If unset $USER_CONF_DIR/simulations is assumed (normally ~/.xschem/simulations)
+set netlist_dir $env(PWD)/simulations
+#### if this is set to '1' netlists and simulations will go into a simulation/ folder
+#### inside the directory containing the top level schematic. Default: not set (0)
+# set local_netlist_dir 1
+
+###########################################################################
+#### NETLIST AND HIERARCHICAL PRINT EXCLUDE PATTERNS
+###########################################################################
+#### xschem_libs is a list of patterns of cells to exclude from netlisting.
+#### Matching is done as regular expression on full cell path
+#### Example:
+#### set xschem_libs { {/cmoslib/} {/analoglib/.*pass} buffer }
+#### in this case all schematic cells of directory cmoslib and cells containing
+#### /analoglib/...pass and buffer will be excluded from netlisting
+#### default value: empty
+# set xschem_libs {}
+#### noprint_libs is a list with same rules as for xschem_libs. This
+#### variable controls hierarchical print
+#### default value: empty
+# set noprint_libs {}
+#### nolist_libs is a list with same rules as for xschem_libs. This
+#### variable controls cell listing in procedure list_hierarchy.
+#### default value: empty
+# set nolist_libs {}
+
+###########################################################################
+#### CHANGE DEFAULT [] WITH SOME OTHER CHARACTERS FOR BUSSED SIGNALS
+#### IN SPICE NETLISTS (EXAMPLE: DATA[7] --> DATA<7>)
+###########################################################################
+#### default: empty (use xschem default, [ ])
+# set bus_replacement_char {<>}
+#### for XSPICE: replace square brackets as the are used for XSPICE vector nodes.
+# set bus_replacement_char {__}
+
+###########################################################################
+#### SOME DEFAULT BEHAVIOR
+###########################################################################
+#### Allowed values: spice, verilog, vhdl, tedax, default: spice
+# set netlist_type spice
+
+#### Some netlisting options (these are the defaults)
+# set hspice_netlist 1
+# set verilog_2001 1
+
+#### to use a fixed line width set change_lw to 0 and set some value to line_width
+#### these are the defaults
+# set line_width 0
+# set change_lw 1
+
+#### allow color postscript and svg exports. Default: 1, enable color
+# set color_ps 1
+
+#### set paper size: name, height, width. Sizes in 1/72 of an inch (typographical points)
+#### default: {a4 842 595}
+# set ps_paper_size {a4 842 595}
+# set ps_paper_size {letter 792 612}
+
+#### initial size of xschem window you can specify also position with (wxh+x+y)
+#### this is the default:
+# set initial_geometry {900x600}
+
+#### if set to 0, when zooming out allow the viewport do drift toward the mouse position,
+#### allowing to move away by zooming / unzooming with mouse wheel
+#### default setting: 0
+# set unzoom_nodrift 0
+
+#### if set to 1 full zoom will center the drawing instead of anhoring to lower
+#### left corner. Default: 0
+set zoom_full_center 1
+
+#### if set to 1 allow to place multiple components with same name.
+#### Warning: this is normally not allowed in any simulation netlist.
+#### default: 0, do not allow place multiple elements with same name (refdes)
+# set disable_unique_names 0
+
+#### if set to 1 continue drawing lines / wires after click
+#### default: 0
+# set persistent_command 1
+
+#### if set to 1 a wire is inserted when separating components that are
+#### connected by pins. Default: not enabled (0)
+# set connect_by_kissing 1
+
+#### if set to 1 automatically join/trim wires while editing
+#### this may slow down on rally big designs. Can be disabled via menu
+#### default: 0
+set autotrim_wires 1
+
+#### set widget scaling (mainly for font display), this is useful on 4K displays
+#### default: unset (tk uses its default) > 1.0 ==> bigger
+# set tk_scaling 1.7
+
+#### use the tclreadline package if available , Default: 1 (enabled).
+# set use_tclreadline 1
+
+#### disable some symbol layers. Default: none, all layers are visible.
+# set enable_layer(5) 0 ;# example to disable pin red boxes
+
+#### enable to scale grid point size as done with lines at close zoom, default: 0
+# set big_grid_points 0
+
+#### enable grouping contiguous bits of bus slices in net->pin instance
+#### assignments for verilog netlists. Default: disabled (0)
+# set verilog_bitblast 0
+
+#### allow searching the full search path for schematics associated to symbols
+#### instead of looking only in symbol directory. Default: disabled (0).
+# set search_schematic 0
+
+#### focus the schematic window if mouse goes over it, even if a dialog box
+#### is displayed, without needing to click.
+#### This allows to move/zoom/pan the schematic while editing attributes.
+#### Clicking in the schematic window usually closes the dialog box or starts
+#### editing a new component if clicking on a new component.
+#### default: enabled (1)
+# set autofocus_mainwindow 1
+
+#### set component browser always above drawing canvas.
+#### default: enabled (1)
+# set component_browser_on_top 0
+
+#### set graph line with multiplier with respect to xschem actual line width
+#### default: 2.0
+# set graph_linewidth_mult 2.0
+
+###########################################################################
+#### EXPORT FORMAT TRANSLATORS, PNG AND PDF
+###########################################################################
+#### command to translate xpm to png; (assumes command takes source
+#### and dest file as arguments, example: gm convert plot.xpm plot.png)
+#### default: {gm convert}
+#### Windows ghostscript uses gswin64c
+# set to_png {gswin64c -sDEVICE=png16m -o}
+# set to_png {gm convert}
+
+#### command to translate ps to pdf; (assumes command takes source
+#### and dest file as arguments, example: ps2pdf plot.ps plot.pdf)
+#### default: ps2pdf
+#### Windows ghostscript uses gswin64c
+# set to_pdf {gswin64c -sDEVICE=pdfwrite -o}
+# set to_pdf ps2pdf
+set to_pdf {ps2pdf -dAutoRotatePages=/None}
+
+###########################################################################
+#### UNDO: SAVE ON DISK OR KEEP IN MEMORY
+###########################################################################
+#### Alloved: 'disk'or 'memory'.
+#### Saving undo on disk is safer but slower on extremely big schematics.
+#### In most cases you won't notice any delay. Undo on disk allows previous
+#### state recovery in case of crashes. In-memory undo is extremely fast
+#### but should a crash occur everything is lost.
+#### It is highly recommended to keep undo on disk.
+#### Default: disk
+# set undo_type disk
+
+###########################################################################
+#### CUSTOM GRID / SNAP VALUE SETTINGS
+###########################################################################
+#### Warning: changing these values will likely break compatibility
+#### with existing symbol libraries. Defaults: grid 20, snap 10.
+# set cadgrid 20
+# set cadsnap 10
+
+###########################################################################
+#### CUSTOM COLORS MAY BE DEFINED HERE
+###########################################################################
+# set cadlayers 22
+# set light_colors {
+# "#ffffff" "#0044ee" "#aaaaaa" "#222222" "#229900"
+# "#bb2200" "#00ccee" "#ff0000" "#888800" "#00aaaa"
+# "#880088" "#00ff00" "#0000cc" "#666600" "#557755"
+# "#aa2222" "#7ccc40" "#00ffcc" "#ce0097" "#d2d46b"
+# "#ef6158" "#fdb200" }
+
+# set dark_colors {
+# "#000000" "#00ccee" "#3f3f3f" "#cccccc" "#88dd00"
+# "#bb2200" "#00ccee" "#ff0000" "#ffff00" "#ffffff"
+# "#ff00ff" "#00ff00" "#0000cc" "#aaaa00" "#aaccaa"
+# "#ff7777" "#bfff81" "#00ffcc" "#ce0097" "#d2d46b"
+# "#ef6158" "#fdb200" }
+
+###########################################################################
+#### CAIRO STUFF
+###########################################################################
+#### Scale all fonts by this number
+# set cairo_font_scale 1.0
+
+#### default for following two is 0.85 (xscale) and 0.88 (yscale) to
+#### match cairo font spacing
+# set nocairo_font_xscale 1.0
+#### set nocairo_font_yscale 1.0
+
+#### Scale line spacing by this number
+# set cairo_font_line_spacing 1.0
+
+#### Specify a font
+# set cairo_font_name {Sans-Serif}
+# set svg_font_name {Sans-Serif}
+
+#### Lift up text by some zoom-corrected pixels for
+#### better compatibility wrt no cairo version.
+#### Useful values in the range [-1, 3]
+# set cairo_vert_correct 0
+# set nocairo_vert_correct 0
+
+###########################################################################
+#### KEYBINDINGS
+###########################################################################
+#### General format for specifying a replacement for a keybind
+#### Replace Ctrl-q with Escape (so you wont kill the program)
+# set replace_key(Control-q) Escape
+
+#### swap w and W keybinds; Always specify Shift for capital letters
+# set replace_key(Shift-W) Key-w
+# set replace_key(Key-w) Shift-W
+
+###########################################################################
+#### TERMINAL
+###########################################################################
+#### default for linux: xterm
+# set terminal {xterm -geometry 100x35 -fn 9x15 -bg black -fg white -cr white -ms white }
+#### lxterminal is not OK since it will not inherit env vars:
+#### In order to reduce memory usage and increase the performance, all instances
+#### of the lxterminal are sharing a single process. LXTerminal is part of LXDE
+
+###########################################################################
+#### EDITOR
+###########################################################################
+#### editor must not detach from launching shell (-f mandatory for gvim)
+#### default for linux: gvim -f
+# set editor {gvim -f -geometry 90x28}
+# set editor { xterm -geometry 100x40 -e nano }
+# set editor { xterm -geometry 100x40 -e pico }
+
+#### For Windows
+# set editor {notepad.exe}
+
+###########################################################################
+#### SHOW ERC INFO WINDOW (erc errors, warnings etc)
+###########################################################################
+#### default: 0 (can be enabled by menu)
+# set show_infowindow 0
+
+###########################################################################
+#### ALWAYS SHOW ERC INFO WINDOW AFTER NETLIST
+###########################################################################
+#### default: 0
+# set show_infowindow_after_netlist 0
+
+###########################################################################
+#### TCP CONNECTION WITH GAW
+###########################################################################
+#### set gaw address for socket connection: {host port}
+#### default: set to localhost, port 2020
+# set gaw_tcp_address {localhost 2020}
+
+###########################################################################
+#### XSCHEM LISTEN TO TCP PORT
+###########################################################################
+#### set xschem listening port; default: not enabled
+# set xschem_listen_port 2021
+
+###########################################################################
+#### BESPICE WAVE SOCKET CONNECTION
+###########################################################################
+#### set bespice wave listening port; default: not enabled
+# set bespice_listen_port 2022
+
+###########################################################################
+#### TCL FILES TO LOAD AT STARTUP
+###########################################################################
+#### list of tcl files to preload.
+set tcl_files {}
+lappend tcl_files ${XSCHEM_SHAREDIR}/ngspice_backannotate.tcl
+# lappend tcl_files ${XSCHEM_SHAREDIR}/change_index.tcl
+# lappend tcl_files ....
+
+###########################################################################
+#### WEB URL DOWNLOAD HELPER APPLICATION
+###########################################################################
+#### used to download files from web: default: {curl -f -s -O -J}
+# set download_url_helper {curl -f -s -O -J}
+# set download_url_helper {wget -N --quiet --content-disposition}
+
+###########################################################################
+#### XSCHEM TOOLBAR
+###########################################################################
+#### default: not enabled.
+set toolbar_visible 1
+# set toolbar_horiz 1
+
+###########################################################################
+#### TABBED WINDOWS
+###########################################################################
+# default: not enabled. Interface can be changed runtime if only one window
+# or tab is open.
+set tabbed_interface 1
+
+###########################################################################
+#### CASE INSENSITIVE SYMBOL LOOKUP
+###########################################################################
+## this option might be useful on filesystems that are case insensitive and
+## on designs ported from windows where case of file names does not matter.
+## if this option is set symbol lookup will be case insensitive,
+## so a symbol reference 'AMPLI.SYM' will match with 'ampli.sym' or
+## Amply.sym on disk. File system must be case insensitive for this to work,
+## like FAT32 or NTFS.
+## Do not set this option if you don't know what you are doing.
+## Default: not enabled (0)
+# set case_insensitive 1
+
+###########################################################################
+#### HIDE GRAPHS IF NO SPICE DATA LOADED
+###########################################################################
+## if enabled graphs will be hidden if no data is loaded.
+## default: not enabled (0)
+# set hide_empty_graphs 0
+
+###########################################################################
+#### SHOW HIDDEN TEXTS
+###########################################################################
+## This option shows text objects even if they have attribute 'hide=true' set
+## default: 0 (not set)
+# set show_hidden_texts 1
+
+###########################################################################
+#### LIVE BACKANNOTATION OF DATA AT CURSOR 2 (B) POSITION
+###########################################################################
+## if enabled will backannotate values in schematic at cursor 'b' position
+## in graph. Default: not enabled (0)
+set live_cursor2_backannotate 1
+
+###########################################################################
+#### IHP PDK SPECIFIC VARIABLES
+###########################################################################
+
+## check if env var PDK_ROOT exists, and use it for building open_pdks paths
+if { [info exists env(PDK_ROOT)] && $env(PDK_ROOT) ne {} } {
+ ## found variable, set tcl PDK_ROOT var
+ if {![file isdir $env(PDK_ROOT)]} {
+ puts stderr "Warning: PDK_ROOT environment variable is set but path not found on the system."
+ }
+ set PDK_ROOT $env(PDK_ROOT)
+} else {
+ ## not existing or empty.
+ puts stderr "Warning: PDK_ROOT env. var. not found or empty, trying to find an open_pdks install"
+ if {[file isdir /usr/share/pdk]} {set PDK_ROOT /usr/share/pdk
+ } elseif {[file isdir /usr/local/share/pdk]} {set PDK_ROOT /usr/local/share/pdk
+ } elseif {[file isdir $env(HOME)/share/pdk]} {set PDK_ROOT $env(HOME)/share/pdk
+ } else {
+ puts stderr {No open_pdks installation found, set PDK_ROOT env. var. and restart xschem}
+ }
+}
+
+if {[info exists PDK_ROOT]} {
+ ## get process variant
+ if {[info exists env(PDK)]} {
+ set PDK $env(PDK)
+ } else {
+ set PDK ihp-sg13g2
+ }
+ set SG13G2_MODELS ${PDK_ROOT}/${PDK}/libs.tech/ngspice/models
+ set SG13G2_MODELS_XYCE ${PDK_ROOT}/${PDK}/libs.tech/xyce/models
+ puts stderr "SG13G2_MODELS: $SG13G2_MODELS"
+ puts stderr "SG13G2_MODELS_XYCE: $SG13G2_MODELS_XYCE"
+ #puts stderr "SKYWATER_STDCELLS: $SG13G2_STDCELLS"
+}
+
+
+# open_pdks specific:
+# Set variables after ${PDK_ROOT} is known
+# This overrides some of the variables set above.
+
+set XSCHEM_START_WINDOW ${PDK_ROOT}/${PDK}/libs.tech/xschem/start_page.sch
+append XSCHEM_LIBRARY_PATH :${PDK_ROOT}/${PDK}/libs.tech/xschem
+
+# allow a user-specific path add-on (https://github.com/iic-jku/iic-osic-tools/issues/7)
+if { [info exists ::env(XSCHEM_USER_LIBRARY_PATH) ] } {
+ append XSCHEM_LIBRARY_PATH :$env(XSCHEM_USER_LIBRARY_PATH)
+}
+
+############################################################### DRC checks #######################################
+# IHP SG13G2 mosfets dimension checks
+proc fet_drc {instance symbol model w l ng } {
+ set res {}
+ # strip off the "u" suffix
+ regsub {u$} $w {} w
+ regsub {u$} $l {} l
+ # puts "$instance $model $symbol w=$w l=$l nf=$nf"
+ if { [string is double $w] && [string is double $l] && [string is integer $ng]} {
+
+ # calculate finger width
+ set w [expr { double($w) / double($ng)}]
+
+ switch -regexp $model {
+ {sg13_lv_nmos$} {
+ if { $w < 0.13 } {
+ append res "${instance} ($model): finger width is too small, w/ng = $w, min. w/ng > 0.13u" \n
+ }
+ if { $w > 10.0 } {
+ append res "${instance} ($model): finger width is too big, w/ng = $w, max. w/ng < 10.0u" \n
+ }
+ if { $l < 0.13 } {
+ append res "${instance} ($model): length is too small, l = $l, min l > 0.13u" \n
+ }
+ }
+ {sg13_lv_pmos$} {
+ if { $w < 0.13 } {
+ append res "${instance} ($model): finger width is too small, w/ng = $w, min. w/ng > 0.13u" \n
+ }
+ if { $w > 10.0 } {
+ append res "${instance} ($model): finger width is too big, w/ng = $w, max. w/ng < 10.0u" \n
+ }
+ if { $l < 0.13 } {
+ append res "${instance} ($model): length is too small, l = $l, min. l > 0.13u" \n
+ }
+ }
+ {sg13_hv_nmos$} {
+ if { $w < 0.3 } {
+ append res "${instance} ($model): finger width is too small, w/ng = $w, min w/ng > 0.3u" \n
+ }
+ if { $w > 10.0 } {
+ append res "${instance} ($model): finger width is too big, w/ng = $w, max. w/ng < 10.0u" \n
+ }
+ if { $l < 0.45 } {
+ append res "${instance} ($model): length is too small, l = $l, min. l > 0.45u" \n
+ }
+ }
+ {sg13_hv_pmos$} {
+ if { $w < 0.3 } {
+ append res "${instance} ($model): finger width is too small, w/ng = $w, min. w/ng > 0.3u" \n
+ }
+ if { $w > 10.0 } {
+ append res "${instance} ($model): finger width is too big, w/ng = $w, max. w/ng < 10.0u" \n
+ }
+ if { $l < 0.4 } {
+ append res "${instance} ($model): length is too small, l = $l, min. l > 0.4u" \n
+ }
+ }
+ } ;# switch
+ }
+ return $res
+}
+# IHP SG13G2 resistors dimension checks
+proc res_drc {instance symbol model w l } {
+ set res {}
+ # puts "$instance $model $symbol w=$w l=$l nf=$nf"
+ if { [string is double $w] && [string is double $l] } {
+
+ if { $w < 0.5e-6 } {
+ append res "${instance} ($model): resistor width is too small, w = $w, min. w > 0.5u" \n
+ }
+
+ if { $l < 0.5e-6 } {
+ append res "${instance} ($model): resistor length is too small, l = $l, min. l > 0.5u" \n
+ }
+ }
+ return $res
+}
+# IHP SG13G2 MiM capacitor dimension checks
+proc mim_drc {instance symbol model w l } {
+ set res {}
+
+ if { [string is double $w] && [string is double $l] } {
+ set area [expr { double($w) * double($l) * 1.0e+12}]
+
+ if { $w < 1.14e-6 } {
+ append res "${instance} ($model): MiM capacitor width is too small, w = $w, min. w > 1.14 um" \n
+ }
+
+ if { $area < 1.3 } {
+ append res "${instance} ($model): MiM capacitor area is too small, area = $area, min. area > 1.3 um2" \n
+ }
+
+ if { $area > 5625.0 } {
+ append res "${instance} ($model): MiM capacitor area is too big, area = $area, max. area < 5625.0 um2" \n
+ }
+ }
+ return $res
+}
+# IHP SG13G2 HBT dimension checks
+proc hbt_drc {instance symbol model Nx El } {
+ set res {}
+ # puts "$instance $model $symbol w=$w l=$l nf=$nf"
+ if { [string is integer $Nx] || [string is double $El]} {
+
+
+ switch -regexp $model {
+ {npn13G2$} {
+ if { $Nx < 1 } {
+ append res "${instance} ($model): Number of emmiters Nx = $Nx must be in range 1-10" \n
+ }
+ if { $Nx > 10 } {
+ append res "${instance} ($model): Number of emitters Nx = $Nx must be in range 1-10" \n
+ }
+ }
+ {npn13G2l$} {
+ if { $Nx < 1 } {
+ append res "${instance} ($model): Number of emmiters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $Nx > 4 } {
+ append res "${instance} ($model): Number of emitters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $El < 1.0 } {
+ append res "${instance} ($model): Emitter length El = $El too small, min. El > 1.0 " \n
+ }
+ if { $El > 2.5 } {
+ append res "${instance} ($model): Emitter length El = $El too big, max. El < 2.5 " \n
+ }
+ }
+ {npn13G2v$} {
+ if { $Nx < 1 } {
+ append res "${instance} ($model): Number of emmiters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $Nx > 4 } {
+ append res "${instance} ($model): Number of emitters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $El < 1.0 } {
+ append res "${instance} ($model): Emitter length El = $El too small, min. El > 1.0 " \n
+ }
+ if { $El > 5 } {
+ append res "${instance} ($model): Emitter length El = $El too big, max. El <= 5 " \n
+ }
+ }
+
+ {npn13G2_5t$} {
+ if { $Nx < 1 } {
+ append res "${instance} ($model): Number of emmiters Nx = $Nx must be in range 1-10" \n
+ }
+ if { $Nx > 10 } {
+ append res "${instance} ($model): Number of emitters Nx = $Nx must be in range 1-10" \n
+ }
+ }
+ {npn13G2l_5t$} {
+ if { $Nx < 1 } {
+ append res "${instance} ($model): Number of emmiters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $Nx > 4 } {
+ append res "${instance} ($model): Number of emitters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $El < 1.0 } {
+ append res "${instance} ($model): Emitter length El = $El too small, min. El > 1.0 " \n
+ }
+ if { $El > 2.5 } {
+ append res "${instance} ($model): Emitter length El = $El too big, max. El < 2.5 " \n
+ }
+ }
+ {npn13G2v_5t$} {
+ if { $Nx < 1 } {
+ append res "${instance} ($model): Number of emmiters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $Nx > 4 } {
+ append res "${instance} ($model): Number of emitters Nx = $Nx must be in range 1-4" \n
+ }
+ if { $El < 1.0 } {
+ append res "${instance} ($model): Emitter length El = $El too small, min. El > 1.0 " \n
+ }
+ if { $El > 5 } {
+ append res "${instance} ($model): Emitter length El = $El too big, max. El <= 5 " \n
+ }
+ }
+ } ;# switch
+ }
+ return $res
+}
+# IHP SG13G2 HBT diodes checks
+proc diode_drc {instance symbol model w l } {
+ set res {}
+ regsub {u$} $w {} w
+ regsub {u$} $l {} l
+ # puts "$instance $model $symbol w=$w l=$l nf=$nf"
+ if { [string is double $w] && [string is double $l]} {
+
+ switch -regexp $model {
+ {dantenna} {
+ if { $w < 0.78 } {
+ append res "${instance} ($model): Diode width w = $w too small, min w > 0.78 um" \n
+ }
+ if { $l < 0.78 } {
+ append res "${instance} ($model): Diode length l = $l too small, min l > 0.78 um" \n
+ }
+ }
+ {dpantenna} {
+ if { $w < 0.78 } {
+ append res "${instance} ($model): Diode width w = $w too small, min w > 0.78 um" \n
+ }
+ if { $l < 0.78 } {
+ append res "${instance} ($model): Diode length l = $l too small, min l > 0.78 um" \n
+ }
+ }
+ } ;# switch
+ }
+ return $res
+}
+
+
+##################### save and display MOSFET parameters #####################
+
+# writes the .save instructions for given FET instance
+proc write_save_lines {type model schpath spiceprefix instname} {
+ global sch_expand
+ if {[regexp {[pn]mos} $type]} {
+ set m n$model
+ set devpath [string tolower @n.$schpath$spiceprefix$instname.$m]
+
+ append sch_expand(savelist) ".save $devpath\[gm\]\n"
+ append sch_expand(savelist) ".save $devpath\[gds\]\n"
+ append sch_expand(savelist) ".save $devpath\[vth\]\n"
+ append sch_expand(savelist) ".save $devpath\[vdss\]\n"
+ append sch_expand(savelist) ".save $devpath\[cgg\]\n"
+ append sch_expand(savelist) ".save $devpath\[cgsol\]\n"
+ append sch_expand(savelist) ".save $devpath\[cgdol\]\n"
+ }
+}
+
+############ sch_expand
+# This proc traverses the hierarchy and prints all instances in design.
+proc sch_expand {{only_subckts 1} {all_hierarchy 1} {pattern {.*}}} {
+ global sch_expand keep_symbols
+ set sch_expand(savelist) {}
+ set sch_expand(only_subckts) $only_subckts
+ set sch_expand(all_hierarchy) $all_hierarchy
+ set sch_expand(startpath) [string length [xschem get sch_path]]
+ set save_keep $keep_symbols
+ set keep_symbols 1
+ xschem unselect_all
+ xschem set no_draw 1 ;# disable screen update
+ xschem set no_undo 1 ;# disable undo
+
+ hier_sch_expand 0 $only_subckts $all_hierarchy $pattern
+
+ xschem set no_draw 0
+ xschem set no_undo 0
+ set keep_symbols $save_keep
+ return {}
+}
+
+# recursive procedure used by sch_expand
+proc hier_sch_expand {{level 0} {only_subckts 0} {all_hierarchy 1} {pattern {.*}}} {
+ global nolist_libs sch_expand
+
+ set schpath [string range [xschem get sch_path] $sch_expand(startpath) end]
+ set instances [xschem get instances]
+ for {set i 0} { $i < $instances} { incr i} {
+ set instname [xschem getprop instance $i name]
+ # puts "hier_sch_expand: instname=$instname schpath=$schpath"
+ set symbol [xschem getprop instance $i cell::name]
+ set spiceprefix [xschem getprop instance $i spiceprefix]
+ set model [xschem translate $instname @model]
+ set abs_symbol [abs_sym_path $symbol]
+ set type [xschem getprop symbol $symbol type]
+
+ if {$only_subckts && ($type ne {subcircuit})} { continue }
+ set skip 0
+ foreach j $nolist_libs {
+ if {[regexp $j $abs_symbol]} {
+ set skip 1
+ break
+ }
+ }
+ if {$skip} { continue }
+ if {$type ne {subcircuit} && ![regexp $pattern $type]} {
+ continue
+ }
+
+ write_save_lines $type $model $schpath $spiceprefix $instname
+
+ if {$type eq {subcircuit} && $all_hierarchy} {
+ xschem select instance $i fast nodraw
+ # puts "descend: [xschem translate $i @name]"
+ set descended [xschem descend 1 6]
+ if {$descended} {
+ incr level
+ set dp [hier_sch_expand $level $only_subckts 1 $pattern]
+ xschem go_back 1
+ incr level -1
+ }
+ }
+ }
+ return 1
+}
+############ /sch_expand
+
+# generate the .save lines to save all mos parameters
+proc save_fet_params {} {
+ global sch_expand
+ sch_expand 0 1 {[pn]mos}
+ return "* Place this .save file with a .include line in your testbench\n\n$sch_expand(savelist)"
+}
+
+# displays mos parameters simulation data , used in symbol sky130_fd_pr/annotate_fet_params.sym
+proc display_fet_params {instname} {
+ set txt {}
+ set schpath [xschem get sim_sch_path]
+ set symbol [xschem getprop instance $instname cell::name]
+ set spiceprefix [xschem getprop instance $instname spiceprefix]
+ set model [xschem translate $instname @model]
+ set type [xschem getprop symbol $symbol type]
+
+ if {[regexp {[pn]mos} $type]} {
+ set m n$model
+ set devpath [string tolower @n.$schpath$spiceprefix$instname.$m]
+
+ append txt "gm = [to_eng [xschem raw value $devpath\[gm\] -1]]\n"
+ append txt "gds = [to_eng [xschem raw value $devpath\[gds\] -1]]\n"
+ append txt "vth = [to_eng [xschem raw value v($devpath\[vth\]) -1]]\n"
+ append txt "vdss = [to_eng [xschem raw value v($devpath\[vdss\]) -1]]\n"
+ append txt "cgg = [to_eng [xschem raw value $devpath\[cgg\] -1]]\n"
+ append txt "cgdol = [to_eng [xschem raw value $devpath\[cgdol\] -1]]\n"
+ append txt "cgsol = [to_eng [xschem raw value $devpath\[cgsol\] -1]]\n"
+ set pi 3.141592654
+ set gm [xschem raw value $devpath\[gm\] -1]
+ set cgg [xschem raw value $devpath\[cgg\] -1]
+ set cgdol [xschem raw value $devpath\[cgdol\] -1]
+ set cgsol [xschem raw value $devpath\[cgsol\] -1]
+ if {[catch { expr $gm / 2 / $pi / ($cgg + $cgdol + $cgsol)} ft]} {
+ set ft {}
+ }
+ append txt "ft = [to_eng ${ft}]\n"
+ }
+ return $txt
+}
+
+
+# these commands are executed when xschem has completed initialization.
+# add a SKY130 menu entry
+proc menupdk {} {
+ global has_x netlist_dir
+ if { [info exists has_x] } {
+ set topwin [xschem get top_path]
+
+ # insert before the 'Netlist' menu
+ $topwin.menubar insert Netlist cascade -label IHP -menu $topwin.menubar.ihp
+ menu $topwin.menubar.ihp -tearoff 0
+
+ ## Create one entry
+ $topwin.menubar.ihp add command -label {Create FET .save file} -command {
+ write_data [save_fet_params] $netlist_dir/[file rootname [file tail [xschem get current_name]]].save
+ textwindow $netlist_dir/[file rootname [file tail [xschem get current_name]]].save
+ }
+ ## Create one entry
+ $topwin.menubar.ihp add command -label {Add models symbol} -command {
+ xschem place_symbol devices/code_shown.sym {
+name=TT_MODELS
+only_toplevel=true
+value="
+** IHP models
+.lib cornerMOSlv.lib mos_tt
+.lib cornerMOShv.lib mos_tt
+"
+spice_ignore=false
+ }
+ }
+
+ ## Create one entry
+ $topwin.menubar.ihp add command -label {Add FET param annotator} -command {
+ proc get_sel_inst_name {} {
+ set selset [lindex [xschem selected_set] 0]
+ if {$selset ne {}} {
+ set name [xschem getprop instance $selset name]
+ xschem place_symbol sg13g2_pr/annotate_fet_params.sym "name=annot1 ref=$name"
+ } else {
+ xschem place_symbol sg13g2_pr/annotate_fet_params.sym
+ }
+ }
+ get_sel_inst_name
+ }
+ }
+}
+
+# execute menupdk when xschem initialization is completed
+append postinit_commands "menupdk\n"
+
+##################### /save and display MOSFET parameters #####################