coriolis/cumulus/src/designflow/lvx.py

69 lines
2.3 KiB
Python
Raw Normal View History

import os
import subprocess
from pathlib import Path
from doit.exceptions import TaskFailed
from .task import FlowTask, ShellEnv
class MissingTarget ( Exception ): pass
class Lvx ( FlowTask ):
MergeSupply = 0x0001
SaveReorder = 0x0002
CheckUnassigned = 0x0004
Flatten = 0x0008
@staticmethod
def mkRule ( rule, depends=[], flags=0 ):
return Lvx( rule, depends, flags )
def __init__ ( self, rule, depends, flags ):
import CRL
super().__init__( rule, [], depends )
self.flags = flags
self.referenceFile = Path( self.file_depend(0) )
self.checkedFile = Path( self.file_depend(1) )
self.command = [ 'lvx'
, self.referenceFile.suffix[1:]
, self.checkedFile.suffix[1:]
, self.referenceFile.stem
, self.checkedFile.stem ]
if flags & Lvx.MergeSupply: self.command.append( '-a' )
if flags & Lvx.SaveReorder: self.command.append( '-o' )
if flags & Lvx.CheckUnassigned: self.command.append( '-u' )
if flags & Lvx.Flatten: self.command.append( '-f' )
if self.flags & Lvx.SaveReorder:
env = CRL.AllianceFramework.get().getEnvironment()
self.targets = [ self.checkedFile.stem + '.' + env.getOUT_LO() ]
self.addClean( self.targets )
def __repr__ ( self ):
return '<{}>'.format( ' '.join(self.command) )
def doTask ( self ):
from CRL import AllianceFramework
from helpers.io import ErrorMessage
shellEnv = ShellEnv()
shellEnv.export()
state = subprocess.run( self.command )
if state.returncode:
e = ErrorMessage( 1, 'Lvx.doTask(): UNIX command failed ({}).' \
.format( state.returncode ))
return TaskFailed( e )
return self.checkTargets( 'Lvx.doTask' )
def create_doit_tasks ( self ):
return { 'basename' : self.basename
, 'actions' : [ self.doTask ]
, 'doc' : 'Run {}.'.format( self )
, 'targets' : self.targets
, 'file_dep' : self.file_dep
}