forked from p4lang/behavioral-model
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconditionals.cpp
59 lines (52 loc) · 2 KB
/
conditionals.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
/* Copyright 2013-present Barefoot Networks, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Antonin Bas ([email protected])
*
*/
#include <bm/bm_sim/conditionals.h>
#include <bm/bm_sim/event_logger.h>
#include <bm/bm_sim/packet.h>
#include <bm/bm_sim/logger.h>
#include <cassert>
namespace bm {
const ControlFlowNode *
Conditional::operator()(Packet *pkt) const {
// TODO(antonin)
// this is temporary while we experiment with the debugger
DEBUGGER_NOTIFY_CTR(
Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()),
DBG_CTR_CONDITION | get_id());
PHV *phv = pkt->get_phv();
bool result = eval(*phv);
BMELOG(condition_eval, *pkt, *this, result);
// It would be nicer to see the following additional info in the log:
//
// + The full expression even if it spans multiple lines.
// + The current values of all variables involved in evaluating the
// expression.
BMLOG_TRACE_SI_PKT(*pkt, get_source_info(), "Condition \"{}\" ({}) is {}",
(get_source_info() == nullptr) ? get_name() :
get_source_info()->get_source_fragment(),
get_name(), result);
DEBUGGER_NOTIFY_UPDATE_V(
Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()),
Debugger::FIELD_COND, result);
DEBUGGER_NOTIFY_CTR(
Debugger::PacketId::make(pkt->get_packet_id(), pkt->get_copy_id()),
DBG_CTR_EXIT(DBG_CTR_CONDITION) | get_id());
return result ? true_next : false_next;
}
} // namespace bm