!------------------------------------------------------------------
!   Device linking rule for MOSFETs with unconnected SD contact
!------------------------------------------------------------------

define procedure "mos_linker" /replace
  parameter device1Params
  parameter device2Params
  parameter device1Pin
  parameter device2Pin
  parameter externalConn
  do begin

    if (device1Pin EQL "S") then begin
      device1Params["RightCont"] = true;
      device1Params["RightLink"] = true; 
      device1Params["bodytie_typeR"] = "NONE";
!      device1Params["RightStretch"] = true;
    end;
    if (device1Pin EQL "D") then begin
      device1Params["LeftCont"] = true;
      device1Params["LeftLink"] = true;
      device1Params["bodytie_typeL"] = "NONE";
!      device1Params["LeftStretch"] = true;
    end;
    if (device2Pin EQL "S") then begin
      device2Params["RightCont"] = false;
      device2Params["RightLink"] = true;
      device2Params["bodytie_typeR"] = "NONE";
!      device2Params["RightStretch"] = true;
    end;
    if (device2Pin EQL "D") then begin
      device2Params["LeftCont"] = false;
      device2Params["LeftLink"] = true;
      device2Params["bodytie_typeL"] = "NONE";
!      device2Params["LeftStretch"] = true;
    end;

    if ((device1Pin EQL "S") and (device2Pin EQL "S")) then begin
 
!      device1Params["RightStretch"] = true;
!      device2Params["RightStretch"] = false;
 
    end;
       
    if ((device1Pin EQL "D") and (device2Pin EQL "D")) then begin
 
 !     device1Params["LeftStretch"] = true;
 !     device2Params["LeftStretch"] = false;
 
    end;

  end;

!------------------------------------------------------------------
!   Device linking rule for MOSFETs without unconnected SD contact
!------------------------------------------------------------------

define procedure "mos_linker_2" /replace
  parameter device1Params
  parameter device2Params
  parameter device1Pin
  parameter device2Pin
  parameter externalConn
  do begin

    if (device1Pin EQL "S") then begin
      device1Params["RightCont"] = externalConn;
      device1Params["RightLink"] = true; 
      device1Params["bodytie_typeR"] = "NONE";
      device1Params["RightStretch"] = not externalConn;
    end;
    if (device1Pin EQL "D") then begin
      device1Params["LeftCont"] = externalConn;
      device1Params["LeftLink"] = true;
      device1Params["bodytie_typeL"] = "NONE";
      device1Params["LeftStretch"] = not externalConn;
    end;
    if (device2Pin EQL "S") then begin
      device2Params["RightCont"] = false;
      device2Params["RightLink"] = true;
      device2Params["bodytie_typeR"] = "NONE";
      device2Params["RightStretch"] = not externalConn;
    end;
    if (device2Pin EQL "D") then begin
      device2Params["LeftCont"] = false;
      device2Params["LeftLink"] = true;
      device2Params["bodytie_typeL"] = "NONE";
      device2Params["LeftStretch"] = not externalConn;
    end;

    if ((device1Pin EQL "S") and (device2Pin EQL "S")) then begin
 
!      device1Params["RightStretch"] = true;
!      device2Params["RightStretch"] = false;
 
    end;
       
    if ((device1Pin EQL "D") and (device2Pin EQL "D")) then begin
 
 !     device1Params["LeftStretch"] = true;
 !     device2Params["LeftStretch"] = false;
 
    end;

  end;

!------------------------------------------------------------------
!   Device linking rule for resistors
!------------------------------------------------------------------

define procedure "tsmc_res_linker" /replace
  parameter device1Params
  parameter device2Params
  parameter device1Pin
  parameter device2Pin
  parameter externalConn
  do begin

  display("device1Pin=" & device1Pin);
  display("device2Pin=" & device2Pin);


  if (device1Params["LinkDirection"] EQL "HORIZONTAL") then begin

    if (device1Pin EQL "P") then begin
      device1Params["RightLink"] = true; 
    end;

    if (device1Pin EQL "N") then begin
      device1Params["LeftLink"] = true;
    end;

    if (device2Pin EQL "P") then begin
      device2Params["RightLink"] = true;
    end;

    if (device2Pin EQL "N") then begin
      device2Params["LeftLink"] = true;
    end;

  end;

  !-------------------------------------------------------------------
  !   for vertical link
  !-------------------------------------------------------------------

  if (device1Params["LinkDirection"] EQL "VERTICAL") then begin

    if (device1Pin NEQ device2Pin) then begin
 
      device2Params["SwapTerminals"] = not device2Params["SwapTerminals"];

      if (device1Pin EQL "P") then begin
        device1Params["RightLink"] = true;
      end;

      if (device1Pin EQL "N") then begin
        device1Params["LeftLink"] = true;
      end;

      if (device2Pin EQL "P") then begin
        device2Params["LeftLink"] = true;
      end;

      if (device2Pin EQL "N") then begin
        device2Params["RightLink"] = true;
      end;
 
    end;

    if ((device1Pin EQL device2Pin) and (device1Params["LinkDirection"] EQL "VERTICAL")) then begin
 
      device2Params["SwapTerminals"] = device2Params["SwapTerminals"];

      if (device1Pin EQL "P") then begin
        device1Params["RightLink"] = true;
      end;

      if (device1Pin EQL "N") then begin
        device1Params["LeftLink"] = true;
      end;

      if (device2Pin EQL "P") then begin
        device2Params["RightLink"] = true;
      end;

      if (device2Pin EQL "N") then begin
        device2Params["LeftLink"] = true;
      end;

    end;

  end; ! for vertical link

end;