-
Notifications
You must be signed in to change notification settings - Fork 19
/
VFInfo.cpp
80 lines (66 loc) · 2.7 KB
/
VFInfo.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//===-- VFInfo.cpp - VTM Per-Function Information Class Implementation ----===//
//
// The Shang HLS frameowrk //
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the interfaces that VTM uses to lower LLVM code
// into a selection DAG.
//
//===----------------------------------------------------------------------===//
#include "vtm/VFInfo.h"
#include "vtm/VInstrInfo.h"
#include "vtm/VerilogAST.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/MathExtras.h"
using namespace llvm;
unsigned VFInfo::getTotalSlotFor(const MachineBasicBlock* MBB) const {
std::map<const MachineBasicBlock*, StateSlots>::const_iterator
at = StateSlotMap.find(MBB);
assert(at != StateSlotMap.end() && "State not found!");
return at->second.totalSlot;
}
unsigned VFInfo::getStartSlotFor(const MachineBasicBlock* MBB) const {
std::map<const MachineBasicBlock*, StateSlots>::const_iterator
at = StateSlotMap.find(MBB);
assert(at != StateSlotMap.end() && "State not found!");
return at->second.startSlot;
}
unsigned VFInfo::getIISlotFor(const MachineBasicBlock* MBB) const {
std::map<const MachineBasicBlock*, StateSlots>::const_iterator
at = StateSlotMap.find(MBB);
assert(at != StateSlotMap.end() && "State not found!");
return at->second.IISlot;
}
void VFInfo::rememberTotalSlot(const MachineBasicBlock* MBB, unsigned startSlot,
unsigned totalSlot, unsigned IISlot) {
StateSlots SS;
assert(IISlot <= startSlot + totalSlot && "Bad pipelined schedule!");
SS.startSlot = startSlot;
SS.totalSlot = totalSlot;
SS.IISlot = IISlot;
StateSlotMap.insert(std::make_pair(MBB, SS));
}
void VFInfo::allocateBRAM(uint16_t ID, unsigned NumElem,
unsigned ElemSizeInBytes, const Value* Initializer) {
bool Inserted = BRams.insert(std::make_pair(ID, BRamInfo(NumElem,
ElemSizeInBytes,
Initializer))).second;
assert(Inserted && "BRAM already existed!");
}
VFInfo::VFInfo(MachineFunction &MF)
: TotalSlot(0), Info(getSynSetting(MF.getFunction()->getName())),
BitWidthAnnotated(true) {}
VFInfo::~VFInfo() { }
void VFInfo::setTotalSlots(unsigned Slots) {
TotalSlot = Slots;
}
void VFInfo::remapCallee(StringRef FNName, unsigned NewFNNum) {
FNMapTy::iterator at = UsedFNs.find(FNName);
assert(at != UsedFNs.end() && "Callee not exist!");
assert(at->second != NewFNNum && "No need to remap FNNum!");
at->second = NewFNNum;
}