Skip to content

Commit

Permalink
Merge pull request #97 from cthsieh/vanilla
Browse files Browse the repository at this point in the history
Add vanilla backend
  • Loading branch information
lubatang authored Oct 10, 2018
2 parents c01c96b + 49aa46e commit 3685322
Show file tree
Hide file tree
Showing 14 changed files with 534 additions and 0 deletions.
39 changes: 39 additions & 0 deletions include/onnc/IR/CodeEmit.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//===- CodeEmitPass.h ----------------------------------------------------===//
//
// The ONNC Project
//
// See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef ONNC_IR_CODE_EMIT_H
#define ONNC_IR_CODE_EMIT_H
#include <onnc/Core/ModulePass.h>
#include <onnc/Support/IOStream.h>

namespace onnc {

class CodeEmit : public ModulePass
{
public:
static char ID;

public:
CodeEmit(ComputeVisitor& pCodeEmitVisitor)
: ModulePass(CodeEmit::ID), m_CodeEmitVisitor(pCodeEmitVisitor) {}

StringRef getPassName() const override { return "CodeEmit"; }

Pass::ReturnType runOnModule(Module& pModule) override;

private:
Pass::ReturnType runOnComputeGraph(ComputeGraph& pCG);

ComputeVisitor& m_CodeEmitVisitor;
};

CodeEmit* CreateCodeEmitPass(ComputeVisitor& pCodeEmitVisitor);

} // namespace of onnc


#endif
1 change: 1 addition & 0 deletions include/onnc/IR/Quadruple.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class Quadruple
/// Architecture type.
enum ArchType {
UnknownArch, // Unknown architecture
vanilla, // Vanilla DLA

aarch64, // AArch64: aarch64
arm, // ARM: arm, armv.*, xscale
Expand Down
53 changes: 53 additions & 0 deletions lib/IR/CodeEmit.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//===- CodeEmit.cpp -------------------------------------------------------===//
//
// The ONNC Project
//
// See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <onnc/IR/CodeEmit.h>
#include <onnc/Core/PassSupport.h>
#include <onnc/Support/IOStream.h>

using namespace onnc;

//===----------------------------------------------------------------------===//
// CodeEmit
//===----------------------------------------------------------------------===//
Pass::ReturnType CodeEmit::runOnModule(Module& pModule)
{
unsigned result = Pass::kModuleNoChanged;
Module::cg_iterator cg, cgEnd = pModule.cgEnd();
for (cg = pModule.cgBegin(); cg != cgEnd; ++cg)
result |= runOnComputeGraph(*cg->value());
return result;
}

Pass::ReturnType CodeEmit::runOnComputeGraph(ComputeGraph& pCG)
{
ComputeGraph::iterator nodeIt, nEnd = pCG.end();
for (nodeIt = pCG.begin(); nodeIt != nEnd; ++nodeIt) {
const onnc::ComputeOperator *node = nodeIt;
///beforeEmit(node);
node->accept(m_CodeEmitVisitor);
}
return Pass::kModuleNoChanged;
}

//===----------------------------------------------------------------------===//
// CodeEmit factory method
//===----------------------------------------------------------------------===//
char CodeEmit::ID = 0;

#if 0
//FIXME a pass class with input parameter cannot be initialized?
namespace onnc
{
INITIALIZE_PASS(CodeEmit, "CodeEmit")
}
#endif

CodeEmit* onnc::CreateCodeEmitPass(ComputeVisitor& pCodeEmitVisitor)
{
return new CodeEmit(pCodeEmitVisitor);
}
8 changes: 8 additions & 0 deletions lib/IR/Quadruple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ Quadruple::ArchType onnc::ParseArch(StringRef pArchName)
.Case("spir64", Quadruple::spir64)
.Case("sophon", Quadruple::sophon)
.StartsWith("sophonv", Quadruple::sophon)
.Case("vanilla", Quadruple::vanilla)
.Default(Quadruple::UnknownArch);
}

Expand Down Expand Up @@ -340,6 +341,7 @@ onnc::ArchToName(Quadruple::ArchType pType, Quadruple::SubArchType pSubType)
default: return "sophon";
}
}
case Quadruple::vanilla: return "vanilla";
case Quadruple::UnknownArch:
default: return "unknown";
}
Expand Down Expand Up @@ -513,6 +515,9 @@ static unsigned getArchBitWidth(Quadruple::ArchType pArch)
case Quadruple::UnknownArch:
return 0;

case Quadruple::vanilla:
return 8;

case Quadruple::msp430:
return 16;

Expand Down Expand Up @@ -555,6 +560,9 @@ static unsigned getPointerBitWidth(Quadruple::ArchType pArch)
case Quadruple::UnknownArch:
return 0;

case Quadruple::vanilla:
return 8;

case Quadruple::msp430:
return 16;

Expand Down
4 changes: 4 additions & 0 deletions lib/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ ONNC_SOURCES = \
IR/InsertionPoint.cpp \
IR/IRBuilder.cpp \
IR/ONNCModulePrinter.cpp \
IR/CodeEmit.cpp \
IR/Compute/Value.cpp \
IR/Compute/Scalar.cpp \
IR/Compute/Scale.cpp \
Expand Down Expand Up @@ -341,6 +342,9 @@ if ENABLE_X86_TARGET
include $(srcdir)/Target/X86/Makefile.am
endif

# FIXME: embraced by flag?
include $(srcdir)/Target/Vanilla/Makefile.am

#####################################
# Build shared libraries
lib_LIBRARIES = libonnc.a
Expand Down
64 changes: 64 additions & 0 deletions lib/Target/Vanilla/CodeEmitVisitor.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//===- CodeEmitVisitor.cpp ------------------------------------------------===//
//
// The ONNC Project
//
// See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <onnc/Support/IOStream.h>
#include "CodeEmitVisitor.h"
#include <onnc/IR/Compute/Conv.h>
#include <onnc/IR/Compute/Initializer.h>
#include <onnc/IR/Compute/InputOperator.h>
#include <onnc/IR/Compute/OutputOperator.h>

using namespace onnc;
using namespace onnc::vanilla;

void CodeEmitVisitor::visit(Initializer& pInitializer)
{
pInitializer.print(errs());
errs() << "\n";
}

void CodeEmitVisitor::visit(const Initializer& pInitializer)
{
pInitializer.print(errs());
errs() << "\n";
}

void CodeEmitVisitor::visit(InputOperator& pInputOperator)
{
pInputOperator.print(errs());
errs() << "\n";
}

void CodeEmitVisitor::visit(const InputOperator& pInputOperator)
{
pInputOperator.print(errs());
errs() << "\n";
}

void CodeEmitVisitor::visit(OutputOperator& pOutputOperator)
{
pOutputOperator.print(errs());
errs() << "\n";
}

void CodeEmitVisitor::visit(const OutputOperator& pOutputOperator)
{
pOutputOperator.print(errs());
errs() << "\n";
}

void CodeEmitVisitor::visit(Conv& pConv)
{
pConv.print(errs());
errs() << "\n";
}

void CodeEmitVisitor::visit(const Conv& pConv)
{
pConv.print(errs());
errs() << "\n";
}
46 changes: 46 additions & 0 deletions lib/Target/Vanilla/CodeEmitVisitor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//===- CodeEmitVisitor.h --------------------------------------------------===//
//
// The ONNC Project
//
// See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef TARGET_VANILLA_CODE_EMIT_VISITOR_H
#define TARGET_VANILLA_CODE_EMIT_VISITOR_H
#include <onnc/IR/ComputeVisitor.h>

namespace onnc {

namespace vanilla {

class CodeEmitVisitor : public ComputeVisitor
{
public:
static char ID;

/// ONNC defined operators @{
void visit(const Initializer& pInitializer) override;
void visit(const InputOperator& pInputOperator) override;
void visit(const OutputOperator& pOutputOperator) override;
/// @}

/// ONNX defined operators @{
void visit(const Conv& pConv) override;
/// @}

/// ONNC defined operators @{
void visit(Initializer& pInitializer) override;
void visit(InputOperator& pInputOperator) override;
void visit(OutputOperator& pOutputOperator) override;
/// @}

/// ONNX defined operators @{
void visit(Conv& pConv) override;
/// @}

};

} // namespace vanilla
} // namespace onnc

#endif
6 changes: 6 additions & 0 deletions lib/Target/Vanilla/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ONNC_TARGET_SOURCES += \
Target/Vanilla/VanillaBackend.cpp \
Target/Vanilla/CodeEmitVisitor.cpp \
Target/Vanilla/TargetInfo/VanillaTargetInfo.cpp \
Target/Vanilla/TargetInfo/VanillaTargetMemInfo.cpp

40 changes: 40 additions & 0 deletions lib/Target/Vanilla/TargetInfo/VanillaTargetInfo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//===- VanillaTargetInfo.cpp --------------------------------------------------===//
//
// The ONNC Project
//
// See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "VanillaTargetInfo.h"
#include <onnc/IR/Quadruple.h>
#include <onnc/Target/TargetRegistry.h>

using namespace onnc;

//===----------------------------------------------------------------------===//
// Non-member functions
//===----------------------------------------------------------------------===//


static unsigned int VanillaMatchFn(const Quadruple& pQuadruple)
{
unsigned int score = 0;
if (Quadruple::vanilla == pQuadruple.getArch()) {
score += 10;
}

return score;
}


Target& onnc::getTheVanillaTarget()
{
static Target vanilla_target;
return vanilla_target;
}


extern "C" void InitializeVanillaONNCPlatform() {
onnc::TargetRegistry::RegisterTarget(onnc::getTheVanillaTarget(), "vanilla",
"Vanilla DLA", VanillaMatchFn);
}
18 changes: 18 additions & 0 deletions lib/Target/Vanilla/TargetInfo/VanillaTargetInfo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//===- VanillaTargetInfo.h ----------------------------------------------------===//
//
// The ONNC Project
//
// See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef ONNC_TARGET_VANILLA_TARGET_INFO_H
#define ONNC_TARGET_VANILLA_TARGET_INFO_H
#include <onnc/Target/Target.h>

namespace onnc {

Target& getTheVanillaTarget();

} // namespace of onnc

#endif
49 changes: 49 additions & 0 deletions lib/Target/Vanilla/TargetInfo/VanillaTargetMemInfo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//===- VanillaTargetMemInfo.cpp ------------------------------------------===//
//
// The ONNC Project
//
// See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "VanillaTargetMemInfo.h"
#include <onnc/IR/Compute/Tensor.h>

using namespace onnc;

MemSize VanillaTargetMemInfo::getTensorMemorySize(const Tensor& pVal)
{
uint64_t align, size;
switch (pVal.kind()) {
case kUint8:
case kInt8:
case kBoolean:
align = 16, size = 1;
break;

case kUint16:
case kInt16:
case kFloat16:
align = 16, size = 2;
break;

case kFloat:
case kInt32:
case kUint32:
align = 16, size = 4;
break;

case kInt64:
case kUint64:
align = 16, size = 8;
break;

default:
assert(false && "Un-support value type.");
return MemSize();
}

for (auto i : pVal.getDimensions())
size *= i;

return MemSize(align, size);
}
Loading

0 comments on commit 3685322

Please sign in to comment.