Specific Process Knowledge/Lithography/EBeamLithography/Dose Testing: Difference between revisions
Appearance
| 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> | |||