2017-09-12 12:48:21 +02:00
|
|
|
/*
|
|
|
|
* generated by Xtext 2.12.0
|
|
|
|
*/
|
|
|
|
package com.minres.rdl.generator
|
|
|
|
|
2017-09-19 18:08:17 +02:00
|
|
|
import com.minres.rdl.rdl.ComponentDefinition
|
|
|
|
import com.minres.rdl.rdl.ComponentDefinitionType
|
2017-09-12 12:48:21 +02:00
|
|
|
import org.eclipse.emf.ecore.resource.Resource
|
|
|
|
import org.eclipse.xtext.generator.AbstractGenerator
|
|
|
|
import org.eclipse.xtext.generator.IFileSystemAccess2
|
|
|
|
import org.eclipse.xtext.generator.IGeneratorContext
|
2018-06-04 20:55:10 +02:00
|
|
|
import static extension com.minres.rdl.RdlUtil.*
|
2020-10-08 08:40:04 +02:00
|
|
|
import java.util.Map
|
2017-09-12 12:48:21 +02:00
|
|
|
|
|
|
|
class RDLGenerator extends AbstractGenerator {
|
|
|
|
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
|
2022-02-13 12:40:21 +01:00
|
|
|
val force = if(context instanceof RdlGeneratorContext) context.forceOverwrite else false
|
|
|
|
val namespace = if(context instanceof RdlGeneratorContext) context.namespace else "sysc"
|
2022-10-24 20:18:49 +02:00
|
|
|
val genFW = if(context instanceof RdlGeneratorContext) context.generateFw else true
|
|
|
|
val genSC = if(context instanceof RdlGeneratorContext) context.generateSc else true
|
2017-09-19 18:08:17 +02:00
|
|
|
resource.resourceSet.allContents.filter[ it instanceof ComponentDefinition].map[it as ComponentDefinition].forEach[
|
2020-10-08 08:40:04 +02:00
|
|
|
val genMap = it.fileGenerator
|
|
|
|
if(genMap!==null) genMap.forEach[p1, gen |
|
2022-10-24 20:18:49 +02:00
|
|
|
if((p1=='fw' && genFW) || (p1!='fw' && genSC)) {
|
|
|
|
val header = gen.generateHeader(namespace)
|
|
|
|
val prefix = if(p1=="fw") 'fw-' else 'sc-'
|
2022-10-26 10:30:44 +02:00
|
|
|
val inclFileName = (if(p1=="gen") p1 else '.') + '/'+it.effectiveName+'.h'
|
2022-10-24 20:18:49 +02:00
|
|
|
val inclCfg = fsa.outputConfig(prefix+'incl-out')
|
|
|
|
if((force || !fsa.isFile(inclFileName, inclCfg) || gen.overwrite) && header!==null && header.length>0)
|
|
|
|
fsa.generateFile(inclFileName, inclCfg, header)
|
|
|
|
val source = gen.generateSource(namespace)
|
2022-10-26 10:30:44 +02:00
|
|
|
val srcFileName = (if(p1=="gen") p1 else '.') + '/'+it.effectiveName+'.cpp'
|
2022-10-24 20:18:49 +02:00
|
|
|
val srcCfg = fsa.outputConfig(prefix+'src-out')
|
|
|
|
if((force || !fsa.isFile(srcFileName, srcCfg) || gen.overwrite) && source!==null && source.length>0)
|
|
|
|
fsa.generateFile(srcFileName, srcCfg, source)
|
|
|
|
}
|
2020-10-08 08:40:04 +02:00
|
|
|
]
|
2017-09-19 18:08:17 +02:00
|
|
|
]
|
|
|
|
}
|
2022-02-13 12:40:21 +01:00
|
|
|
|
2020-10-08 08:40:04 +02:00
|
|
|
def Map<String, RdlBaseGenerator> fileGenerator(ComponentDefinition definition){
|
2017-09-19 18:08:17 +02:00
|
|
|
switch(definition.type){
|
2022-02-13 12:40:21 +01:00
|
|
|
case ComponentDefinitionType.REGFILE: #{
|
|
|
|
'gen' -> new RegfileGenerator(definition),
|
|
|
|
'fw' -> new FwRegfileGenerator(definition),
|
|
|
|
'.' -> new ModuleGenerator(definition)}
|
|
|
|
case ComponentDefinitionType.ADDRMAP: #{
|
|
|
|
'gen' -> new AddrmapGenerator(definition),
|
|
|
|
'fw' -> new FwAddrmapGenerator(definition)}
|
2017-09-19 18:08:17 +02:00
|
|
|
default: null
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
def String outputConfig(IFileSystemAccess2 fsa, String string){
|
|
|
|
var output_config = string
|
|
|
|
try {fsa.getURI("", output_config)} catch (Exception e) {output_config ='DEFAULT_OUTPUT'}
|
|
|
|
return output_config
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|