1
2 import os, sys
3
4 import empro
5 if ("activeProjectView" in empro.gui.__dict__):
6 notification = "gui"
7 else:
8 notification = "text"
9
11 '''
12 converts an UTF-8 path to Unicode.
13 '''
14 import sys
15 if isinstance(path, bytes):
16 path = path.decode("utf-8")
17 if "win" in sys.platform:
18 path = os.path.abspath(path)
19 if not path.startswith(u"\\\\?\\"):
20 if path.startswith("\\\\"):
21 path = u"\\\\?\\UNC\%s" % path[2:]
22 else:
23 path = u"\\\\?\\%s" % path
24 return path
25
28 import os,sys
29 if ADS_HPEESOF_DIR == "":
30 EMPROHOME = os.environ['EMPROHOME']
31 ADS_HPEESOF_DIR = os.path.join(EMPROHOME,'mom')
32 ADSbinPath = os.path.join(ADS_HPEESOF_DIR,'bin')
33 ADSlibPath = os.path.join(ADS_HPEESOF_DIR,'lib')
34 if 'win' in sys.platform:
35 self.oldenviron = os.environ['PATH']
36 os.environ['PATH']=ADSbinPath+";"+os.environ['PATH']
37 else:
38 self.oldenviron = os.environ['PATH']
39 os.environ['PATH']=ADSbinPath+":"+os.environ['PATH']
40 self.oldlibpath = os.environ['LD_LIBRARY_PATH']
41 os.environ['LD_LIBRARY_PATH']=os.path.join(ADSlibPath,"linux_x86")+":"+os.path.join(ADSlibPath,"linux_x86_64")+":"+ADSlibPath+":"+os.environ['LD_LIBRARY_PATH']
42
44 os.environ['PATH'] = self.oldenviron
45 if not 'win' in sys.platform:
46 os.environ['LD_LIBRARY_PATH'] = self.oldlibpath
47
48
51
53 - def __init__(self,min,max,updateProgressFunction):
54 self.min = min
55 self.max = max
56 self.updateProgressFunction = updateProgressFunction
57
59 localValue = self.min + int(value * (self.max - self.min)/100.0)
60 self.updateProgressFunction(localValue)
61
64 self._ADFIimportWarnings = []
65 pass
66
68 self._ADFIimportWarnings.append("Warning: " + msg)
70 self._ADFIimportWarnings.append("Error: " + msg)
71
73
74 import os
75 EMPROHOME = os.environ['EMPROHOME']
76 if simFDTD:
77 simDirName="FDTD"
78 else:
79 simDirName="FEM"
80 optDirName = os.path.join(EMPROHOME,os.path.pardir,os.path.pardir,"data","ADS_option_templates",simDirName)
81 try:
82 import shutil
83 for fname in os.listdir(optDirName):
84 sourceFile = os.path.join(optDirName,fname)
85 targetFile = os.path.join(workingDir,fname)
86 shutil.copyfile(_decode_path(sourceFile),_decode_path(targetFile))
87 except:
88
89 self.logWarning("Problem with copying ADS option files.")
90
91 adfiFile = os.path.basename(os.path.abspath(adfiFileName))
92 adfiBaseName,ext = os.path.splitext(adfiFile)
93 fileList = os.listdir(_decode_path(workingDir))
94 hasExtLtd = lambda x: os.path.splitext(x)[1]==".ltd"
95 ltdFiles = filter(hasExtLtd,fileList)
96 longestLtdFileName = max(ltdFiles, key=len)
97 longestLtdBaseName = os.path.splitext(os.path.basename(longestLtdFileName))[0]
98
99 fileMapping = [(longestLtdBaseName+".slm","proj.slm"),
100 (longestLtdBaseName+".ltd","proj.ltd"),
101 (longestLtdBaseName+".lay","proj.lay"),
102 (adfiBaseName+"_top.prt" ,"proj.prt"),
103 (adfiBaseName+"_top.pin" ,"proj.pin"),
104 (adfiBaseName+"_adfi.dbw" ,"proj.dbw"),
105 (adfiBaseName+"_adfi_egs" ,"proj_a" )]
106 import shutil
107 notFoundList = []
108 for source, target in fileMapping:
109 sourceFile = os.path.join(workingDir,source)
110 targetFile = os.path.join(workingDir,target)
111 if os.path.exists(_decode_path(sourceFile)):
112 shutil.copy(_decode_path(sourceFile),_decode_path(targetFile))
113 else:
114 notFoundList.append(sourceFile)
115 if len(notFoundList)>0:
116 raise Exception("Could not find the following files: %s" % notFoundList)
117
119 import subprocess
120 MomEngine_cmd = ["MomEngine","-GP","--mode=fem-preparation", os.path.join(workingDir,"proj"),os.path.join(workingDir,"proj")]
121 try:
122 startupinfo = subprocess.STARTUPINFO()
123 startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
124 except AttributeError:
125 startupinfo = None
126 try:
127 sim_pr = subprocess.Popen(MomEngine_cmd,startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
128 out,err=sim_pr.communicate()
129 except subprocess.CalledProcessError, e:
130 import traceback
131 print out
132 print err
133 raise Exception("exit status %s of command %s" % (e.returncode, e.cmd))
134
136 "import proj in dirname"
137 import imp
138 fname = "proj.py"
139 name = fname.split('.')[0]
140 f, modpath, desc = imp.find_module(name, [dirname])
141 proj = imp.load_module(name, f, modpath, desc)
142 return proj
143
145 try:
146 proj_version = proj.getVersion()
147 except AttributeError:
148 proj_version = 0
149 return proj_version
150
156
157 - def _importProj(self,dirName,topAssembly,bwMap,useJedecBondwires,sbMap,useSolderBalls,simFDTD,updateProgressFunction=_dummyUpdateProgress):
158 usedFlow = "Adfi"
159 proj = self._load_and_get_proj_module(dirName)
160 projVersion = self._get_proj_version(proj)
161 try:
162 session = proj.get_session(usedFlow=usedFlow)
163 session.setBondwireMap(bwMap)
164 session.setUseJedecBondwires(useJedecBondwires)
165 session.setSolderBallMap(sbMap)
166 session.setUseSolderBalls(useSolderBalls)
167 import empro.toolkit.simulation
168 if simFDTD:
169 session.setSimulator(empro.toolkit.simulation.FDTD)
170 else:
171 session.setSimulator(empro.toolkit.simulation.FEM)
172 except:
173 session = None
174 if projVersion >= 4:
175 if not simFDTD:
176 proj.ads_simulation_settings()
177 if projVersion >= 7:
178 importer = proj.projImporter(usedFlow,session,updateProgressFunction=updateProgressFunction)
179 else:
180 importer = proj.projImporter(usedFlow,session)
181 if projVersion <= 5:
182 session.setProjImporter(importer)
183 warnings = importer.ads_import(usedFlow=usedFlow,topAssembly = topAssembly,demoMode=False,includeInvalidPorts=False)
184 else:
185 try:
186 warnings = proj.ads_import(usedFlow=usedFlow,topAssembly = topAssembly,session=session,includeInvalidPorts=False)
187 except TypeError:
188 try:
189 warnings = proj.ads_import(usedFlow=usedFlow,topAssembly = topAssembly,session=session)
190 except TypeError:
191 warnings = proj.ads_import()
192 if simFDTD:
193 self._noSheetPorts()
194 try:
195 self._ADFIimportWarnings.extend(warnings)
196 except TypeError:
197 pass
198 return warnings
199
200
201 - def _adfi_parse(self,adfiFileName,targetDir,useJedecBondwires,useSolderBalls,bwMap,sbMap):
216
218 import os
219 import subprocess,string
220 import empro.toolkit.gui
221 envVars = os.environ.copy()
222 subedCmd = ['eesofsubed',ltdFileName]
223
224 myProcess = subprocess.Popen(args=subedCmd,
225 executable=None,
226 stdin=None,
227 stdout=subprocess.PIPE,
228 stderr=subprocess.PIPE,
229 startupinfo=None,
230 shell=False,
231 env=envVars,
232 universal_newlines=True)
233
234 out,err=myProcess.communicate()
235
236 res=err.join(out)
237 empro.toolkit.gui.InfoDialog("eesofsubed %s output: %s" % (ltdFileName,res), "%s import: intermission" % "Adfi",True)
238
239
241 import empro.toolkit.gui
242 import os.path
243 ltdFileName = os.path.join(targetDir,"proj.ltd")
244 try:
245 self._openSubstrate(ltdFileName)
246 except:
247 empro.toolkit.gui.InfoDialog("Unable to open the substrate file %s" % ltdFileName, "%s import: intermission" % "Adfi",True)
248
249 - def _adfi2proj(self,ADS_HPEESOF_DIR,adfiFileName,targetDir,useJedecBondwires,useSolderBalls,bwMap,sbMap,simFDTD,openSubstrateEditor=False):
250 envObj = _environmentSetRestore()
251 self._adfi_parse(adfiFileName,targetDir,useJedecBondwires,useSolderBalls,bwMap,sbMap)
252 envObj.set_environment(ADS_HPEESOF_DIR)
253 self._makeProjFiles(adfiFileName,targetDir,simFDTD)
254 if openSubstrateEditor:
255 envObj.restore_environment()
256 self._editSubstrate(targetDir)
257 envObj.set_environment(ADS_HPEESOF_DIR)
258 self._runMomEngine(targetDir)
259 envObj.restore_environment()
260
267
279
280 - def importAdfiComponents(self,adfiFileName,useJedecBondwires=False,useSolderBalls=True,topAssembly=None):
293
294 - def importAdfi(self,ADS_HPEESOF_DIR,adfiFileName,useJedecBondwires=False,updateProgressFunction=_dummyUpdateProgress,useSolderBalls=True,simFDTD=False):
295 import tempfile
296 import empro
297 import empro.toolkit.ads_import
298 demoMode=empro.toolkit.ads_import.useDemoMode()
299 try:
300 tempDir = tempfile.mkdtemp()
301 updateProgressFunction(10)
302
303 bwMap = {}
304 sbMap = {}
305 self._adfi2proj(ADS_HPEESOF_DIR,adfiFileName,tempDir,useJedecBondwires,useSolderBalls,bwMap,sbMap,simFDTD)
306 updateProgressFunction(30)
307
308 test = False
309 if test:
310 empro.toolkit.gui.InfoDialog("Time to edit proj.py in %s" % tempDir,"%s import: intermission" % "Adfi",True)
311 topAssembly = empro.geometry.Assembly()
312 topAssembly.name = 'Adfi_import'
313 if demoMode:
314 empro.activeProject.geometry().append(topAssembly)
315 progressUpdater = updateProgressClass(30,70,updateProgressFunction)
316 self._importProj(tempDir,topAssembly,bwMap,useJedecBondwires,sbMap,useSolderBalls,simFDTD,updateProgressFunction=progressUpdater.updateProgress)
317 updateProgressFunction(70)
318
319 import shutil
320 shutil.rmtree(_decode_path(tempDir))
321 updateProgressFunction(75)
322
323 self.importAdfiComponents(adfiFileName,False,False,topAssembly)
324 updateProgressFunction(90)
325 if not demoMode:
326 empro.activeProject.geometry().append(topAssembly)
327 except Exception, err:
328 self.logError(unicode(err))
329 finally:
330 if (notification == "gui"):
331 empro.gui.activeProjectView().zoomGeometryViewToExtents()
332 self._setSimulator(simFDTD)
333 return self._ADFIimportWarnings
334
335
336 -def importAdfiComponents(adfiFileName,useJedecBondwires=False,useSolderBalls=True,topAssembly=None):
339
340 -def importAdfi(ADS_HPEESOF_DIR,adfiFileName,useJedecBondwires=False,updateProgressFunction=_dummyUpdateProgress,useSolderBalls=True,simFDTD=False):
341 importer = AdfiImporter()
342 return importer.importAdfi(ADS_HPEESOF_DIR,adfiFileName,useJedecBondwires=useJedecBondwires,updateProgressFunction=updateProgressFunction,useSolderBalls=useSolderBalls,simFDTD=simFDTD)
343
345 print """Use this module as follows:
346 warnings = empro.toolkit.adfi_import.importAdfi(ADS_HPEESOF_DIR,adfiFileName)
347 """
348
349 if __name__=="__main__":
350 _main()
351