54 #include "config_HAVE_FROM_PRAGMA_BUILT.hpp" 55 #include "config_HAVE_HOST_PROFILING_BUILT.hpp" 56 #include "config_HAVE_ILP_BUILT.hpp" 57 #include "config_HAVE_PRAGMA_BUILT.hpp" 58 #include "config_HAVE_TASTE.hpp" 61 #if HAVE_HOST_PROFILING_BUILT 94 #if HAVE_FROM_PRAGMA_BUILT 125 #if HAVE_FROM_PRAGMA_BUILT 129 #if HAVE_HOST_PROFILING_BUILT 156 #if HAVE_FROM_PRAGMA_BUILT 162 const DesignFlowManagerConstRef _design_flow_manager,
175 frontend_flow_step_type_end = frontend_flow_step_types.end();
176 for(frontend_flow_step_type = frontend_flow_step_types.begin();
177 frontend_flow_step_type != frontend_flow_step_type_end; ++frontend_flow_step_type)
181 return frontend_flow_steps;
187 switch(frontend_flow_step_type)
189 case ADD_BB_ECFG_EDGES:
190 case ADD_ARTIFICIAL_CALL_FLOW_EDGES:
191 case ADD_OP_EXIT_FLOW_EDGES:
192 case ADD_OP_LOOP_FLOW_EDGES:
193 case ADD_OP_PHI_FLOW_EDGES:
194 case BASIC_BLOCKS_CFG_COMPUTATION:
195 case BB_CONTROL_DEPENDENCE_COMPUTATION:
196 case BB_FEEDBACK_EDGES_IDENTIFICATION:
197 case BB_ORDER_COMPUTATION:
198 case BB_REACHABILITY_COMPUTATION:
203 case BUILD_VIRTUAL_PHI:
205 case CALL_GRAPH_BUILTIN_CALL:
206 case CHECK_SYSTEM_TYPE:
207 case COMPLETE_BB_GRAPH:
208 case COMPUTE_IMPLICIT_CALLS:
209 case COMMUTATIVE_EXPR_RESTRUCTURING:
210 case COND_EXPR_RESTRUCTURING:
212 case DATAFLOW_CG_EXT:
213 case DEAD_CODE_ELIMINATION:
214 case DETERMINE_MEMORY_ACCESSES:
215 case DOM_POST_DOM_COMPUTATION:
218 case MULTIPLE_ENTRY_IF_REDUCTION:
219 case EXTRACT_GIMPLE_COND_OP:
220 #if HAVE_FROM_PRAGMA_BUILT 221 case EXTRACT_OMP_ATOMIC:
222 case EXTRACT_OMP_FOR:
224 case EXTRACT_PATTERNS:
225 case FUNCTION_CALL_TYPE_CLEANUP:
226 case FUNCTION_CALL_OPT:
227 case FIX_STRUCTS_PASSED_BY_VALUE:
229 case HDL_VAR_DECL_FIX:
231 case HWCALL_INJECTION:
233 case LOOP_COMPUTATION:
234 case LOOPS_ANALYSIS_BAMBU:
235 case LOOPS_COMPUTATION:
236 case LUT_TRANSFORMATION:
238 case NI_SSA_LIVENESS:
239 case OP_CONTROL_DEPENDENCE_COMPUTATION:
240 case OP_FEEDBACK_EDGES_IDENTIFICATION:
241 case OP_ORDER_COMPUTATION:
242 case OP_REACHABILITY_COMPUTATION:
243 case OPERATIONS_CFG_COMPUTATION:
245 case PARM_DECL_TAKEN_ADDRESS:
247 case PREDICATE_STATEMENTS:
248 case REBUILD_INITIALIZATION:
249 case REBUILD_INITIALIZATION2:
250 case REMOVE_CLOBBER_GA:
251 case REMOVE_ENDING_IF:
253 case SDC_CODE_MOTION:
255 case SERIALIZE_MUTUAL_EXCLUSIONS:
257 case SHORT_CIRCUIT_TAF:
258 case SIMPLE_CODE_MOTION:
259 case SOFT_FLOAT_CG_EXT:
260 case SCALAR_SSA_DATA_FLOW_ANALYSIS:
263 case UPDATE_SCHEDULE:
265 case UN_COMPARISON_LOWERING:
266 case UNROLLING_DEGREE:
271 case VERIFICATION_OPERATION:
272 case VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS:
273 case VIRTUAL_PHI_NODES_SPLIT:
278 #if HAVE_HOST_PROFILING_BUILT 279 case BASIC_BLOCKS_PROFILING:
281 case BAMBU_FRONTEND_FLOW:
283 case INTERFACE_INFER:
284 case(COMPLETE_CALL_GRAPH):
286 case CREATE_ADDRESS_TRANSLATION:
288 case(CREATE_TREE_MANAGER):
289 case DEAD_CODE_ELIMINATION_IPA:
290 case FIND_MAX_TRANSFORMATIONS:
291 case FUNCTION_ANALYSIS:
292 case HDL_FUNCTION_DECL_FIX:
293 #if HAVE_HOST_PROFILING_BUILT 296 #if HAVE_FROM_PRAGMA_BUILT 297 case PRAGMA_ANALYSIS:
299 #if HAVE_FROM_PRAGMA_BUILT 300 case PRAGMA_SUBSTITUTION:
304 case(SYMBOLIC_APPLICATION_FRONTEND_FLOW_STEP):
317 switch(design_flow_step_type)
319 #if HAVE_HOST_PROFILING_BUILT 320 case BASIC_BLOCKS_PROFILING:
325 case BAMBU_FRONTEND_FLOW:
333 case INTERFACE_INFER:
337 case(COMPLETE_CALL_GRAPH):
342 case CREATE_ADDRESS_TRANSLATION:
347 case(CREATE_TREE_MANAGER):
351 case DEAD_CODE_ELIMINATION_IPA:
355 case FIND_MAX_TRANSFORMATIONS:
359 case(FUNCTION_ANALYSIS):
363 case HDL_FUNCTION_DECL_FIX:
367 #if HAVE_HOST_PROFILING_BUILT 368 case(HOST_PROFILING):
373 #if HAVE_PRAGMA_BUILT 374 case PRAGMA_ANALYSIS:
379 #if HAVE_FROM_PRAGMA_BUILT 380 case(PRAGMA_SUBSTITUTION):
393 case ADD_BB_ECFG_EDGES:
394 case ADD_ARTIFICIAL_CALL_FLOW_EDGES:
395 case ADD_OP_EXIT_FLOW_EDGES:
396 case ADD_OP_LOOP_FLOW_EDGES:
397 case ADD_OP_PHI_FLOW_EDGES:
398 case BASIC_BLOCKS_CFG_COMPUTATION:
399 case BB_CONTROL_DEPENDENCE_COMPUTATION:
400 case BB_FEEDBACK_EDGES_IDENTIFICATION:
401 case BB_ORDER_COMPUTATION:
402 case BB_REACHABILITY_COMPUTATION:
407 case BUILD_VIRTUAL_PHI:
409 case CALL_GRAPH_BUILTIN_CALL:
410 case CHECK_SYSTEM_TYPE:
411 case COMPLETE_BB_GRAPH:
412 case COMPUTE_IMPLICIT_CALLS:
413 case COMMUTATIVE_EXPR_RESTRUCTURING:
414 case COND_EXPR_RESTRUCTURING:
416 case DATAFLOW_CG_EXT:
417 case DEAD_CODE_ELIMINATION:
418 case DETERMINE_MEMORY_ACCESSES:
419 case DOM_POST_DOM_COMPUTATION:
422 case MULTIPLE_ENTRY_IF_REDUCTION:
423 case EXTRACT_GIMPLE_COND_OP:
424 #if HAVE_FROM_PRAGMA_BUILT 425 case EXTRACT_OMP_ATOMIC:
426 case EXTRACT_OMP_FOR:
428 case EXTRACT_PATTERNS:
429 case FUNCTION_CALL_TYPE_CLEANUP:
430 case FUNCTION_CALL_OPT:
431 case FIX_STRUCTS_PASSED_BY_VALUE:
433 case HDL_VAR_DECL_FIX:
435 case HWCALL_INJECTION:
437 case LOOP_COMPUTATION:
438 case LOOPS_ANALYSIS_BAMBU:
439 case LOOPS_COMPUTATION:
440 case LUT_TRANSFORMATION:
442 case NI_SSA_LIVENESS:
443 case OP_CONTROL_DEPENDENCE_COMPUTATION:
444 case OP_FEEDBACK_EDGES_IDENTIFICATION:
445 case OP_ORDER_COMPUTATION:
446 case OP_REACHABILITY_COMPUTATION:
447 case OPERATIONS_CFG_COMPUTATION:
449 case PARM_DECL_TAKEN_ADDRESS:
451 case PREDICATE_STATEMENTS:
452 case REBUILD_INITIALIZATION:
453 case REBUILD_INITIALIZATION2:
454 case REMOVE_CLOBBER_GA:
455 case REMOVE_ENDING_IF:
457 case SDC_CODE_MOTION:
459 case SERIALIZE_MUTUAL_EXCLUSIONS:
461 case SHORT_CIRCUIT_TAF:
462 case SIMPLE_CODE_MOTION:
463 case SOFT_FLOAT_CG_EXT:
464 case SCALAR_SSA_DATA_FLOW_ANALYSIS:
466 case UN_COMPARISON_LOWERING:
467 case UNROLLING_DEGREE:
469 case UPDATE_SCHEDULE:
475 case VERIFICATION_OPERATION:
476 case VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS:
477 case VIRTUAL_PHI_NODES_SPLIT:
483 case SYMBOLIC_APPLICATION_FRONTEND_FLOW_STEP:
485 THROW_UNREACHABLE(
"Symbolic Application Frontend Flow Step must be created by GenerateFrontendSteps");
496 const unsigned int function_id)
const 498 switch(design_flow_step_type)
500 case ADD_BB_ECFG_EDGES:
504 case ADD_ARTIFICIAL_CALL_FLOW_EDGES:
509 case ADD_OP_EXIT_FLOW_EDGES:
513 case ADD_OP_LOOP_FLOW_EDGES:
517 case ADD_OP_PHI_FLOW_EDGES:
521 case BASIC_BLOCKS_CFG_COMPUTATION:
526 case BB_CONTROL_DEPENDENCE_COMPUTATION:
530 case BB_FEEDBACK_EDGES_IDENTIFICATION:
535 case BB_ORDER_COMPUTATION:
539 case BB_REACHABILITY_COMPUTATION:
560 case BUILD_VIRTUAL_PHI:
568 case CALL_GRAPH_BUILTIN_CALL:
572 case CHECK_SYSTEM_TYPE:
576 case COMPLETE_BB_GRAPH:
580 case COMPUTE_IMPLICIT_CALLS:
585 case COMMUTATIVE_EXPR_RESTRUCTURING:
590 case COND_EXPR_RESTRUCTURING:
598 case DATAFLOW_CG_EXT:
602 case DEAD_CODE_ELIMINATION:
606 case DETERMINE_MEMORY_ACCESSES:
611 case DOM_POST_DOM_COMPUTATION:
624 case(MULTIPLE_ENTRY_IF_REDUCTION):
629 case EXTRACT_GIMPLE_COND_OP:
633 #if HAVE_FROM_PRAGMA_BUILT 634 case EXTRACT_OMP_ATOMIC:
638 case EXTRACT_OMP_FOR:
643 case EXTRACT_PATTERNS:
647 case FIX_STRUCTS_PASSED_BY_VALUE:
656 case FUNCTION_CALL_TYPE_CLEANUP:
661 case FUNCTION_CALL_OPT:
665 case HDL_VAR_DECL_FIX:
673 case HWCALL_INJECTION:
681 case LOOP_COMPUTATION:
685 case LOOPS_ANALYSIS_BAMBU:
689 case LOOPS_COMPUTATION:
693 case LUT_TRANSFORMATION:
701 case NI_SSA_LIVENESS:
705 case OP_CONTROL_DEPENDENCE_COMPUTATION:
709 case OP_FEEDBACK_EDGES_IDENTIFICATION:
714 case OP_ORDER_COMPUTATION:
718 case OP_REACHABILITY_COMPUTATION:
723 case OPERATIONS_CFG_COMPUTATION:
732 case PARM_DECL_TAKEN_ADDRESS:
741 case PREDICATE_STATEMENTS:
745 case REBUILD_INITIALIZATION:
750 case REBUILD_INITIALIZATION2:
755 case REMOVE_CLOBBER_GA:
759 case REMOVE_ENDING_IF:
764 case SDC_CODE_MOTION:
769 case SERIALIZE_MUTUAL_EXCLUSIONS:
778 case SHORT_CIRCUIT_TAF:
782 case SIMPLE_CODE_MOTION:
786 case SOFT_FLOAT_CG_EXT:
790 case SCALAR_SSA_DATA_FLOW_ANALYSIS:
799 case UN_COMPARISON_LOWERING:
803 case UNROLLING_DEGREE:
810 case UPDATE_SCHEDULE:
831 case VERIFICATION_OPERATION:
836 case VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS:
841 case VIRTUAL_PHI_NODES_SPLIT:
846 #if HAVE_HOST_PROFILING_BUILT 847 case BASIC_BLOCKS_PROFILING:
849 case BAMBU_FRONTEND_FLOW:
851 case INTERFACE_INFER:
852 case(COMPLETE_CALL_GRAPH):
854 case CREATE_ADDRESS_TRANSLATION:
856 case(CREATE_TREE_MANAGER):
857 case DEAD_CODE_ELIMINATION_IPA:
858 case FIND_MAX_TRANSFORMATIONS:
859 case(FUNCTION_ANALYSIS):
860 case HDL_FUNCTION_DECL_FIX:
861 #if HAVE_HOST_PROFILING_BUILT 862 case(HOST_PROFILING):
864 #if HAVE_PRAGMA_BUILT 865 case(PRAGMA_ANALYSIS):
867 #if HAVE_FROM_PRAGMA_BUILT 868 case(PRAGMA_SUBSTITUTION):
872 case(SYMBOLIC_APPLICATION_FRONTEND_FLOW_STEP):
Compute the feedback edges of the basic block control flow graph.
Rebuild initialization function flow front-end step.
This class contains the methods for vectorize loop or whole function.
const std::string GetPrefix() const override
Return the prefix of the steps created by the factory.
Analysis step that removes clobber gimple_assign introduced by GCC v4.7 and greater.
Analysis step which adds flow edges from the computation of the condition(s) of gimple_cond and gimpl...
const ParameterConstRef parameters
The set of input parameters.
Analyzes operations and creates the sets of read and written variables.
Build call_graph data structure starting from the tree_manager.
Analysis step which adds flow edges for scheduling to operation graphs.
Class that creates the tree_manager starting from the source code files.
const DesignFlowStepSet GenerateFrontendSteps(const CustomUnorderedSet< FrontendFlowStepType > &frontend_flow_step_types) const
Create the frontend design flow steps.
Analysis step rebuilding a short circuit in a single gimple_cond with the condition in three address ...
Analysis step performing aggregate variable computation on the basis of gcc virtual operands...
This class contains the methods for remove mutual exclusions from simd loops.
Determine variables to be stored in memory.
Class which creates source code of hdl module to translate addresses from pci address space to bambu ...
Class performing some optimizations on the IR exploiting Bit Value analysis but executed after Range ...
Analysis step creating the control flow graph for the operations.
Class that creates the tree_manager starting from the source code files.
exceptions managed by PandA
loops computation analysis step
static const std::string EnumToKindText(const FrontendFlowStepType frontend_flow_step_type)
Given a frontend flow step type, return the name of the type.
Class performing the reduction of n input - m output BB by duplicating the BB over all its predecesso...
Analysis step that optimize the phis starting from the IR.
Full implementation of Bit Value analysis as described in BitValue Inference: Detecting and Exploitin...
Analysis step building phi of vops.
Restructure the tree control flow graph.
Analysis step which adds flow edges for scheduling to operation graphs.
Non-Iterative liveness analysis for SSA based gimple descriptions.
Analysis step performing dominators and post dominators computation.
Class to extend basic block cfg.
Writes source code of hdl module to translate addresses from pci address space to bambu address space...
Analysis step computing reachability between basic blocks.
Analysis step computing reachability between operations.
Build call graph structures starting from the tree_manager.
Class to perform adding of flow edges to operation graph.
Analysis step computing a topological order of the operations.
Pre-analysis step computing the relation between parm_decl and the associated ssa_name.
Inter-Procedural extension of the Bit Value analysis as described in BitValue Inference: Detecting an...
Class performing some optimizations on the IR exploiting Bit Value analysis.
Step that extends the call graph with the division and modulus function calls where appropriate...
Class to perform profiling.
#define THROW_UNREACHABLE(str_expr)
helper function used to specify that some points should never be reached
Restructure the tree control flow graph.
Analysis step which fix a non-void list of parameters to function with void as input parameter type...
Pre-analysis step fixing readonly initializations and string_cst references.
Base class for step of design flow.
merge memory dependencies in virtual dependencies
Analysis step computing basic block control dependencies.
This class models the ending of execution of all functions which can add a function to call graph...
Class to perform adding of flow edges to operation graph.
Update schedule of all the instructions.
Analysis step performing a dynamic profiling of basic blocks execution.
Build basic block control flow graph data structure starting from the tree_manager.
Analysis step counting how many time a ssa_name is used.
Abstract class for passes performing a dynamic profiling of loops, paths or both by means of predepen...
Analysis step which adds flow edges to builtin bambu time functions.
const DesignFlowStepRef CreateApplicationFrontendFlowStep(const FrontendFlowStepType design_flow_step_type) const
Create an application frontend flow step.
Analysis step restructing tree of cond_expr to reduce critical path delay.
Pass to add function called through pointers to the call graph.
Pre-analysis step fixing var_decl duplication.
Dataflow call graph extension.
Analysis step rebuilding multi-way if.
Load parsed protocol interface attributes.
Restructure the tree control flow graph.
const DesignFlowStepRef CreateFunctionFrontendFlowStep(const FrontendFlowStepType design_flow_step_type, const unsigned int function_id) const
Create a function frontend flow step.
Step that replace uneq_expr, ltgt_expr, unge_expr, ungt_expr, unle_expr and unlt_expr.
Compute the control flow graph for the operations.
Analysis step which extends basic block cfg.
analyse srcp of variables and types to detect system ones; the identified one are flagged ...
Analysis step performing loops computation.
Structure the original short circuit.
Step that extends the call graph with the soft-float calls where appropriate.
loops computation analysis step
FrontendFlowStepFactory(const application_managerRef AppM, const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters)
Constructor.
enum FrontendFlowStepType { CREATE_TREE_MANAGER, FIND_MAX_TRANSFORMATIONS, FUNCTION_ANALYSIS, SYMBOLIC_APPLICATION_FRONTEND_FLOW_STEP, ADD_BB_ECFG_EDGES, ADD_ARTIFICIAL_CALL_FLOW_EDGES, ADD_OP_EXIT_FLOW_EDGES, ADD_OP_LOOP_FLOW_EDGES, ADD_OP_PHI_FLOW_EDGES, BAMBU_FRONTEND_FLOW, BASIC_BLOCKS_CFG_COMPUTATION, BB_CONTROL_DEPENDENCE_COMPUTATION, BB_FEEDBACK_EDGES_IDENTIFICATION, BB_ORDER_COMPUTATION, BB_REACHABILITY_COMPUTATION, BIT_VALUE, BIT_VALUE_OPT, BITVALUE_RANGE, BIT_VALUE_IPA, BLOCK_FIX, BUILD_VIRTUAL_PHI, CALL_EXPR_FIX, CALL_GRAPH_BUILTIN_CALL, CHECK_SYSTEM_TYPE, COMPLETE_BB_GRAPH, COMPLETE_CALL_GRAPH, COMPUTE_IMPLICIT_CALLS, COMMUTATIVE_EXPR_RESTRUCTURING, COND_EXPR_RESTRUCTURING, CSE_STEP, DATAFLOW_CG_EXT, DEAD_CODE_ELIMINATION, DEAD_CODE_ELIMINATION_IPA, DETERMINE_MEMORY_ACCESSES, DOM_POST_DOM_COMPUTATION, EXTRACT_GIMPLE_COND_OP, EXTRACT_PATTERNS, FIX_STRUCTS_PASSED_BY_VALUE, FUNCTION_CALL_TYPE_CLEANUP, FUNCTION_CALL_OPT, FANOUT_OPT, FIX_VDEF, HDL_FUNCTION_DECL_FIX, HDL_VAR_DECL_FIX, HLS_DIV_CG_EXT, HWCALL_INJECTION, INTERFACE_INFER, IR_LOWERING, LOOP_COMPUTATION, LOOPS_ANALYSIS_BAMBU, LOOPS_COMPUTATION, LUT_TRANSFORMATION, MULTI_WAY_IF, MULTIPLE_ENTRY_IF_REDUCTION, NI_SSA_LIVENESS, OP_CONTROL_DEPENDENCE_COMPUTATION, OP_FEEDBACK_EDGES_IDENTIFICATION, OP_ORDER_COMPUTATION, OP_REACHABILITY_COMPUTATION, OPERATIONS_CFG_COMPUTATION, PARM2SSA, PARM_DECL_TAKEN_ADDRESS, PHI_OPT, PREDICATE_STATEMENTS, ESSA, RANGE_ANALYSIS, REBUILD_INITIALIZATION, REBUILD_INITIALIZATION2, REMOVE_CLOBBER_GA, REMOVE_ENDING_IF, SCALAR_SSA_DATA_FLOW_ANALYSIS, SERIALIZE_MUTUAL_EXCLUSIONS, SPLIT_RETURN, SHORT_CIRCUIT_TAF, SIMPLE_CODE_MOTION, SOFT_FLOAT_CG_EXT, STRING_CST_FIX, SWITCH_FIX, UN_COMPARISON_LOWERING, UNROLLING_DEGREE, USE_COUNTING, VAR_ANALYSIS, VAR_DECL_FIX, VECTORIZE, VERIFICATION_OPERATION, VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS, VIRTUAL_PHI_NODES_SPLIT } FrontendFlowStepType
Pre-analysis step fixing var_decl duplication and HDL name conflicts.
Analysis step which updates the schedule of all the instructions.
This class contains the methods for setting predicates of instructions which cannot be speculated...
Class performing some optimizations on the IR exploiting Bit Value analysis.
This class models the ending of execution of all steps which can modify control flow graph of basic b...
refcount< T > lock() const
Class which system_flag to tree_node of variables and types when necessary.
Restructure the tree control flow graph.
Analysis step that performs some simple code motions over the IR.
Analysis step performing code motion speculation on the basis of sdc results.
rebuild initialization where it is possible
Add to the call graph the function calls associated with the integer division and modulus operations...
refcount< DesignFlowStep > DesignFlowStepRef
Inter-procedural dead code elimination analysis.
Decompose some complex gimple statements into set of simple operations.
Analysis step computing feedback edges for operation control flow graph.
Created on: June 27, 2016.
const Wrefcount< const DesignFlowManager > design_flow_manager
The design flow manager.
const application_managerRef AppM
The application manager.
Analysis step that recognizes the pragma calls in the specification.
This class contains the methods to create a frontend flow step.
Template borrowed from the ANTLR library by Terence Parr (http://www.jGuru.com - Software rights: htt...
Fanout optimization step.
Compute the control flow graph for the operations.
Analysis step that modifies the control flow graph to fix switches.
~FrontendFlowStepFactory() override
Destructor.
Restructure the tree control flow graph.
Analysis step restructing tree of commutative expressions to reduce the critical path delay...
Class to perform profiling.
Compute the feedback edges of the operations graphs.
Class performing some optimizations exploiting the reduction of BB with n inputs and m outputs...
Rebuild initialization function flow front-end step done after IR_lowering.
Analysis step performing data flow analysis based on ssa variables.
Analysis step computing operation control dependencies.
Analysis step that modifies the control flow graph of the tree to make it more compliant.
loops computation analysis step
The step representing the frontend flow for bambu.
Determine variables to be stored in memory.
const DesignFlowStepRef GenerateFrontendStep(FrontendFlowStepType frontend_flow_step_type) const
Create the frontend design flow step.
Analysis step that replaces the pragmas in the specification with calls.
Full implementation of Bit Value analysis as described in BitValue Inference: Detecting and Exploitin...
Pre-analysis step fixing names of functions which clash with signal names.
Add to the call graph the function calls associated with the floating point primitive operations...
This file contains the declaration of the CallGraphBuiltinCall pass that will add function called thr...
This class models the application of a analysis to all the functions of an application.
Compute the control flow graph for the operations.