<?xml version="1.0" encoding="utf-8"?>
<klayout-macro>
 <description>Load PDK options</description>
 <version/>
 <category/>
 <prolog/>
 <epilog/>
 <doc/>
 <autorun>false</autorun>
 <autorun-early>false</autorun-early>
 <shortcut/>
 <show-in-menu>true</show-in-menu>
 <group-name>Load PDK options</group-name>
 <menu-path>submenu&gt;end("gf180ULL PDK").end</menu-path>
 <interpreter>ruby</interpreter>
 <dsl-interpreter-name/>
 <text>module MyMacro
 
  include RBA

  #####################################################################################
  # Loading options
  #####################################################################################
  mw = RBA::MainWindow::instance

  # create a toolbar submenu
  mw.menu.insert_menu("submenu.end", "drc_menu", "Klayout DRC Options")
  mw.menu.insert_menu("submenu.end", "lvs_menu", "Klayout LVS Options")
  #mw.menu.insert_separator("submenu.drc_menu.end", "name1")
  mw.menu.insert_separator("submenu.lvs_menu+", "name2")
  
  
  #####################################################################################
  # Adding DRC options
  #####################################################################################
  
  #0 Setting DRC mode
  drc_mode_action = RBA::Action::new
  drc_mode_action.title = "DRC type"
  drc_mode_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      drc_mode_select = RBA::InputDialog::ask_item("DRC modes options", "Select DRC mode:", [ "Antenna only", "Density only", "Antenna &amp; Density only", "Main only", "Main &amp; Antenna only", "Main &amp; Density only", "Main, Antenna &amp; Density" ], 3)
      if drc_mode_select == "Antenna only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180ULL_antenna.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Density only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180ULL_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Antenna &amp; Density only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180ULL_antenna.drc\n# %include ../drc/gf180ULL_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180ULL.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main &amp; Antenna only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180ULL.drc\n# %include ../drc/gf180ULL_antenna.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main &amp; Density only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180ULL.drc\n# %include ../drc/gf180ULL_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main, Antenna &amp; Density" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180ULL.drc\n# %include ../drc/gf180ULL_antenna.drc\n# %include ../drc/gf180ULL_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "drc_mode", drc_mode_action)
  
  #1 Setting run mode
  run_mode_drc_action = RBA::Action::new
  run_mode_drc_action.title = "Run mode"
  run_mode_drc_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      run_mode_select = RBA::InputDialog::ask_item("Run mode", "Select run mode:", [ "tiling", "deep", "flat" ], 1)
      if run_mode_select 
        if text.include?("$run_mode")
          new_contents = text.gsub(/\$run_mode = \".*\"/, '$run_mode = "'+ run_mode_select + '"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$run_mode = "'+ run_mode_select +'"' +"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "run_mode", run_mode_drc_action)
  
  #2 Setting stack
  stack_drc_action = RBA::Action::new
  stack_drc_action.title = "Stack options"
  stack_drc_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      stack_select = RBA::InputDialog::ask_item("Stack options", "Select stack option:", [ "gf180ULLA", "gf180ULLB", "gf180ULLC" ], 2)
      if stack_select == "gf180ULLA" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ULLB" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ULLC" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "stack", stack_drc_action)
  
  #3 Setting verbose mode
  verbose_drc_action = RBA::Action::new
  verbose_drc_action.title = "Verbose mode"
  verbose_drc_action.checkable=(true)
  verbose_drc_action.checked=(false)
  verbose_drc_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if verbose_drc_action.is_checked?
        verbose_bool = "true"
      else
        verbose_bool = "false"
      end
      if text.include?("$verbose")
        new_contents = text.gsub(/\$verbose = \".*\"/, '$verbose = "'+ verbose_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$verbose = "'+ verbose_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "verbose", verbose_drc_action)
  
  #4 Setting FEOL rules
  feol_action = RBA::Action::new
  feol_action.title = "FEOL rules"
  feol_action.checkable=(true)
  feol_action.checked=(true)
  feol_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if feol_action.is_checked?
        feol_bool = "true"
      else
        feol_bool = "false"
      end
      if text.include?("$feol")
        new_contents = text.gsub(/\$feol = \".*\"/, '$feol = "'+ feol_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$feol = "'+ feol_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "feol", feol_action)
  
  #5 Setting BEOL rules
  beol_action = RBA::Action::new
  beol_action.title = "BEOL rules"
  beol_action.checkable=(true)
  beol_action.checked=(true)
  beol_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if beol_action.is_checked?
        beol_bool = "true"
      else
        beol_bool = "false"
      end
      if text.include?("$feol")
        new_contents = text.gsub(/\$beol = \".*\"/, '$beol = "'+ beol_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$beol = "'+ beol_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "beol", beol_action)
  
  #6 Setting offgrid rules
  offgrid_action = RBA::Action::new
  offgrid_action.title = "Offgrid rules"
  offgrid_action.checkable=(true)
  offgrid_action.checked=(true)
  offgrid_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if offgrid_action.is_checked?
        offgrid_bool = "true"
      else
        offgrid_bool = "false"
      end
      if text.include?("$offgrid")
        new_contents = text.gsub(/\$offgrid = \".*\"/, '$offgrid = "'+ offgrid_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$offgrid = "'+ offgrid_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "offgrid", offgrid_action)
  
  #7 Setting connectivity rules
  connectivity_action = RBA::Action::new
  connectivity_action.title = "Connectivity rules"
  connectivity_action.checkable=(true)
  connectivity_action.checked=(true)
  connectivity_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if connectivity_action.is_checked?
        connectivity_bool = "true"
      else
        connectivity_bool = "false"
      end
      if text.include?("$connectivity")
        new_contents = text.gsub(/\$connectivity = \".*\"/, '$connectivity = "'+ connectivity_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$connectivity = "'+ connectivity_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "connectivity", connectivity_action)
  
  #####################################################################################
  # Adding LVS options
  #####################################################################################
  
  #1 Adding substrate name
  run_action = RBA::Action::new
  run_action.title = "Substrate name"
  run_action.on_triggered do
    sub_name = RBA::InputDialog::ask_string("Substrate name", "Please enter substrate name", "gf180ULL_gnd")
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if sub_name 
        if text.include?("$lvs_sub")
          new_contents = text.gsub(/\$lvs_sub = \".*\"/, '$lvs_sub = "'+ sub_name + '"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$lvs_sub = "'+ sub_name +'"' +"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
    #system( "klayout -r #{File.expand_path File.dirname(__FILE__)}/sky130.lvs -rd input=#{RBA::CellView::active.filename}" )
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "SUB_name", run_action)
  
  #2 Setting run mode
  run_mode_action = RBA::Action::new
  run_mode_action.title = "Run mode"
  run_mode_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      run_mode_select = RBA::InputDialog::ask_item("Run mode", "Select run mode:", [ "tiling", "deep", "flat" ], 1)
      if run_mode_select 
        if text.include?("$run_mode")
          new_contents = text.gsub(/\$run_mode = \".*\"/, '$run_mode = "'+ run_mode_select + '"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$run_mode = "'+ run_mode_select +'"' +"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "run_mode", run_mode_action)
  
  #3 Setting stack
  stack_action = RBA::Action::new
  stack_action.title = "Stack options"
  stack_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      stack_select = RBA::InputDialog::ask_item("Stack options", "Select stack option:", [ "gf180ULLA", "gf180ULLB", "gf180ULLC" ], 2)
      if stack_select == "gf180ULLA" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ULLB" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ULLC" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "stack", stack_action)
  
  #4 Setting spice net names
  spice_net_action = RBA::Action::new
  spice_net_action.title = "SPICE net name"
  spice_net_action.checkable=(true)
  spice_net_action.checked=(true)
  spice_net_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if spice_net_action.is_checked?
        spice_net_bool = "true"
      else
        spice_net_bool = "false"
      end
      if text.include?("$spice_net_names")
        new_contents = text.gsub(/\$spice_net_names = \".*\"/, '$spice_net_names = "'+ spice_net_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$spice_net_names = "'+ spice_net_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "SPICE_net_name", spice_net_action)
  
  #5 Setting spice comments
  spice_comment_action = RBA::Action::new
  spice_comment_action.title = "SPICE comments"
  spice_comment_action.checkable=(true)
  spice_comment_action.checked=(false)
  spice_comment_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if spice_comment_action.is_checked?
        spice_comment_bool = "true"
      else
        spice_comment_bool = "false"
      end
      if text.include?("$spice_with_comments")
        new_contents = text.gsub(/\$spice_with_comments = \".*\"/, '$spice_with_comments = "'+ spice_comment_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$spice_with_comments = "'+ spice_comment_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "SPICE_comments", spice_comment_action)
  
  #6 Setting scaling
  scale_action = RBA::Action::new
  scale_action.title = "Scaling x10^6"
  scale_action.checkable=(true)
  scale_action.checked=(false)
  scale_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if scale_action.is_checked?
        scale_bool = "true"
      else
        scale_bool = "false"
      end
      if text.include?("$scale")
        new_contents = text.gsub(/\$scale = \".*\"/, '$scale = "'+ scale_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$scale = "'+ scale_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "scale", scale_action)
  
  #7 Setting verbose mode
  verbose_action = RBA::Action::new
  verbose_action.title = "Verbose mode"
  verbose_action.checkable=(true)
  verbose_action.checked=(false)
  verbose_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if verbose_action.is_checked?
        verbose_bool = "true"
      else
        verbose_bool = "false"
      end
      if text.include?("$verbose")
        new_contents = text.gsub(/\$verbose = \".*\"/, '$verbose = "'+ verbose_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$verbose = "'+ verbose_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "verbose", verbose_action)
  
  #8 Setting schematic simplification
  schematic_simple_action = RBA::Action::new
  schematic_simple_action.title = "Schematic simplify"
  schematic_simple_action.checkable=(true)
  schematic_simple_action.checked=(false)
  schematic_simple_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if schematic_simple_action.is_checked?
        schematic_simple_bool = "true"
      else
        schematic_simple_bool = "false"
      end
      if text.include?("$schematic_simplify")
        new_contents = text.gsub(/\$schematic_simplify = \".*\"/, '$schematic_simplify = "'+ schematic_simple_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$schematic_simplify = "'+ schematic_simple_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "schematic_simple", schematic_simple_action)
  
  #9 Setting netlist only
  net_only_action = RBA::Action::new
  net_only_action.title = "Netlist only"
  net_only_action.checkable=(true)
  net_only_action.checked=(false)
  net_only_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if net_only_action.is_checked?
        net_only_bool = "true"
      else
        net_only_bool = "false"
      end
      if text.include?("$net_only")
        new_contents = text.gsub(/\$net_only = \".*\"/, '$net_only = "'+ net_only_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$net_only = "'+ net_only_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "net_only", net_only_action)
  
  #10 Setting top level pins
  top_lvl_pins_action = RBA::Action::new
  top_lvl_pins_action.title = "Top level pins"
  top_lvl_pins_action.checkable=(true)
  top_lvl_pins_action.checked=(false)
  top_lvl_pins_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if top_lvl_pins_action.is_checked?
        top_lvl_pins_bool = "true"
      else
        top_lvl_pins_bool = "false"
      end
      if text.include?("$top_lvl_pins")
        new_contents = text.gsub(/\$top_lvl_pins = \".*\"/, '$top_lvl_pins = "'+ top_lvl_pins_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$top_lvl_pins = "'+ top_lvl_pins_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "top_lvl_pins", top_lvl_pins_action)
  
  #11 Setting device combine
  combine_action = RBA::Action::new
  combine_action.title = "Devices combine"
  combine_action.checkable=(true)
  combine_action.checked=(false)
  combine_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if combine_action.is_checked?
        combine_bool = "true"
      else
        combine_bool = "false"
      end
      if text.include?("$combine")
        new_contents = text.gsub(/\$combine = \".*\"/, '$combine = "'+ combine_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$combine = "'+ combine_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "combine", combine_action)
  
  #12 Setting purge
  purge_action = RBA::Action::new
  purge_action.title = "Purge"
  purge_action.checkable=(true)
  purge_action.checked=(false)
  purge_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if purge_action.is_checked?
        purge_bool = "true"
      else
        purge_bool = "false"
      end
      if text.include?("$verbose")
        new_contents = text.gsub(/\$purge = \".*\"/, '$purge = "'+ purge_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$purge = "'+ purge_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "purge", purge_action)
  
  #13 Setting purge nets
  purge_nets_action = RBA::Action::new
  purge_nets_action.title = "Purge nets"
  purge_nets_action.checkable=(true)
  purge_nets_action.checked=(false)
  purge_nets_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180ULL_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if purge_nets_action.is_checked?
        purge_nets_bool = "true"
      else
        purge_nets_bool = "false"
      end
      if text.include?("$purge_nets")
        new_contents = text.gsub(/\$purge_nets = \".*\"/, '$purge_nets = "'+ purge_nets_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$purge_nets = "'+ purge_nets_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "purge_nets", purge_nets_action)
  
  
  #####################################################################################
  # Return to defaults on closing
  #####################################################################################
  
  mw.on_view_closed do
    str = '&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;klayout-macro&gt;
 &lt;description&gt;Run Klayout LVS&lt;/description&gt;
 &lt;version&gt;0.1&lt;/version&gt;
 &lt;category&gt;lvs&lt;/category&gt;
 &lt;prolog/&gt;
 &lt;epilog/&gt;
 &lt;doc/&gt;
 &lt;autorun&gt;false&lt;/autorun&gt;
 &lt;autorun-early&gt;false&lt;/autorun-early&gt;
 &lt;shortcut/&gt;
 &lt;show-in-menu&gt;true&lt;/show-in-menu&gt;
 &lt;group-name/&gt;
 &lt;menu-path&gt;submenu&amp;gt;end("gf180ULL PDK").end&lt;/menu-path&gt;
 &lt;interpreter&gt;dsl&lt;/interpreter&gt;
 &lt;dsl-interpreter-name&gt;lvs-dsl-xml&lt;/dsl-interpreter-name&gt;
 &lt;text&gt;
# Copyright 2022 GlobalFoundries PDK Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

'
  str = str + "\n# %include ../lvs/gf180ULL.lvs\n&lt;/text&gt;\n&lt;/klayout-macro&gt;"

  File.open(File.expand_path(File.dirname(__FILE__)) + "/gf180ULL_lvs.lylvs", 'w') { |f| f.write(str) }
  
  str = '&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;klayout-macro&gt;
 &lt;description&gt;Run Klayout DRC&lt;/description&gt;
 &lt;version&gt;0.1&lt;/version&gt;
 &lt;category&gt;drc&lt;/category&gt;
 &lt;prolog/&gt;
 &lt;epilog/&gt;
 &lt;doc/&gt;
 &lt;autorun&gt;false&lt;/autorun&gt;
 &lt;autorun-early&gt;false&lt;/autorun-early&gt;
 &lt;shortcut/&gt;
 &lt;show-in-menu&gt;true&lt;/show-in-menu&gt;
 &lt;group-name/&gt;
 &lt;menu-path&gt;submenu&amp;gt;end("gf180ULL PDK").end&lt;/menu-path&gt;
 &lt;interpreter&gt;dsl&lt;/interpreter&gt;
 &lt;dsl-interpreter-name&gt;drc-dsl-xml&lt;/dsl-interpreter-name&gt;
 &lt;text&gt;
# Copyright 2022 GlobalFoundries PDK Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

'
  str = str + "\n# %include ../drc/gf180ULL.drc\n&lt;/text&gt;\n&lt;/klayout-macro&gt;"

  File.open(File.expand_path(File.dirname(__FILE__)) + "/gf180ULL_drc.lydrc", 'w') { |f| f.write(str) }
  end

end


</text>
</klayout-macro>
