Jump to content

Specific Process Knowledge/Lithography/EBeamLithography/Dose Testing: Difference between revisions

Thope (talk | contribs)
Thope (talk | contribs)
Line 151: Line 151:


=Scripted expansion of a PEC modulation table=
=Scripted expansion of a PEC modulation table=
The last method is basically the same as the second method above but with support for PEC modulation. This is achieved by expanding the dose modulation table into a set of tables, one for each dose of the dose test. Each modulation table is a scaled version of the initial modulation table, scaled simply by the dose test scaling between each dose. The scaling is done through a Matlab script which can be found here.
The last method is basically the same as the second method above but with support for PEC modulation. This is achieved by expanding the dose modulation table into a set of tables, one for each dose of the dose test. Each modulation table is a scaled version of the initial modulation table, scaled simply by the dose test scaling between each dose. The scaling is done through a Matlab script which can be found here. Since Labadviser does not allow upload of .m files, simply copy the script from below and save as a .m file.
 
<pre>
clearvars
%Modulation table modding for dose test of PEC'ed V30's, see Labadviser for further information
%https://labadviser.nanolab.dtu.dk/index.php?title=Specific_Process_Knowledge/Lithography/EBeamLithography/Dose_Testing
%THOPE 2023-11-06
 
%Input variables for modulation table
inputJDI = 'C:\Users\thope\Desktop\MODMOD\acmossingle.jdi';
outputJDI = 'acmosexpanded.jdi';
m = 9; %number of doses
modulation = 10; %modulation between instances in percent, must be positive
 
%Read file
fileID=fopen(inputJDI,'r');
A = fscanf(fileID,'%c');
fclose(fileID);
%Find start of modulation table by searching for '('
k1 = strfind(A, '(');
k1 = k1(2:end-1);
%Find end of modulation table by searching for ')'
k2 = strfind(A, ')');
k2 = k2(1:end-2);
n = numel(k1);
%Display input table
disp('Input table:')
disp(A(1:k2(end)+1))
 
%Define zero matrix
class = zeros(n,1);
D = zeros(m,n);
 
%Read base modulation
for i = 1:n
    [class(i),D(1,i)] = readMOD(A,k1(i),k2(i));
end
 
%Calculate tables
D(1,:) = 1 + D(1,:)./100 ; %convert from MOD to percent
for i = 2:n
    D(i,:) = D(1,:)*(1+modulation*(i-1)/100);
end
D = round(D,3); %round to 1 decimal
for i = 1:n
    D(i,:) = 100*(D(i,:)-1); %convert to MOD from percent
end
 
%Write modulated tables to file
fileID = fopen(outputJDI,'w');
for i = 1:m
    fprintf(fileID,['MOD' num2str(i) ': MODULAT (']);
    for k = 1:size(D,2)
        if k==1
            fprintf(fileID,['( ' num2str(k-1) ', ' num2str(D(i,k)) '  )']);
        else
            if mod(k,3)
                fprintf(fileID,[' , ( ' num2str(k-1) ', ' num2str(D(i,k)) ' )']);
            else
                fprintf(fileID,[' , ( ' num2str(k-1) ', ' num2str(D(i,k)) ' )']);
                fprintf(fileID,['\n' '-    ']);
            end
        end
    end
    fprintf(fileID,')');
    fprintf(fileID,['\n\n']);
end
fclose(fileID);
 
function [a,b] = readMOD(str,k1,k2)
    str = str(k1:k2);
    x = regexp(str,',');
    a = str2double(str(2:x-1));
    b = str2double(str(x+1:end-1));
end
<\pre>