1ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet/*
2ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Copyright (C) 2017 The Android Open Source Project
3ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *
4ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License");
5ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * you may not use this file except in compliance with the License.
6ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * You may obtain a copy of the License at
7ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *
8ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *      http://www.apache.org/licenses/LICENSE-2.0
9ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet *
10ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software
11ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS,
12ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * See the License for the specific language governing permissions and
14ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * limitations under the License.
15ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet */
16ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
17ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#define LOG_TAG "SampleDriverMinimal"
18ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
19ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "SampleDriver.h"
20ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
21ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "HalInterfaces.h"
22ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "NeuralNetworksOEM.h"
23ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "Utils.h"
24c5e342b62bf25a98d15ae28ee97916b274296e94Jean-Luc Brouillet#include "ValidateHal.h"
25ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
26ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <android-base/logging.h>
27ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <hidl/LegacySupport.h>
28ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <thread>
29ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
30ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace android {
31ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace nn {
32ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace sample_driver {
33ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
34ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletclass SampleDriverMinimal : public SampleDriver {
35ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletpublic:
36ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    SampleDriverMinimal() : SampleDriver("sample-minimal") {}
3747b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross    Return<void> getCapabilities_1_1(getCapabilities_1_1_cb cb) override;
38d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler    Return<void> getSupportedOperations_1_1(const V1_1::Model& model,
39d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler                                            getSupportedOperations_1_1_cb cb) override;
40ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet};
41ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
4247b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid GrossReturn<void> SampleDriverMinimal::getCapabilities_1_1(getCapabilities_1_1_cb cb) {
43a116e12f3a150b3dfc6afa91b0997e551490a9f8Jean-Luc Brouillet    android::nn::initVLogMask();
44820215d28bed6c90f696cde0f282445d16da432eMiao Wang    VLOG(DRIVER) << "getCapabilities()";
45ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    Capabilities capabilities = {.float32Performance = {.execTime = 0.4f, .powerUsage = 0.5f},
4647b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross                                 .quantized8Performance = {.execTime = 1.0f, .powerUsage = 1.0f},
4747b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross                                 .relaxedFloat32toFloat16Performance =
4847b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross                                     {.execTime = 0.4f, .powerUsage = 0.5f}};
49ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    cb(ErrorStatus::NONE, capabilities);
50ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    return Void();
51ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}
52ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
53d56b2323c6e367d77bc226c5e35908d9512af79eMichael ButlerReturn<void> SampleDriverMinimal::getSupportedOperations_1_1(const V1_1::Model& model,
54d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler                                                             getSupportedOperations_1_1_cb cb) {
55820215d28bed6c90f696cde0f282445d16da432eMiao Wang    VLOG(DRIVER) << "getSupportedOperations()";
56ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    if (validateModel(model)) {
57ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        const size_t count = model.operations.size();
58ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        std::vector<bool> supported(count);
59ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        // Simulate supporting just a few ops
60ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        for (size_t i = 0; i < count; i++) {
61ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet            supported[i] = false;
62d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler            const Operation& operation = model.operations[i];
63ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet            switch (operation.type) {
64d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler                case OperationType::ADD:
65d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler                case OperationType::CONCATENATION:
66d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler                case OperationType::CONV_2D: {
67ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                    const Operand& firstOperand = model.operands[operation.inputs[0]];
68ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                    if (firstOperand.type == OperandType::TENSOR_FLOAT32) {
69ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                        supported[i] = true;
70ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                    }
71ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                    break;
72ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                }
73ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                default:
74ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet                    break;
75ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet            }
76ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        }
77ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        cb(ErrorStatus::NONE, supported);
78ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    } else {
79ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        std::vector<bool> supported;
80ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet        cb(ErrorStatus::INVALID_ARGUMENT, supported);
81ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    }
82ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    return Void();
83ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}
84ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
85ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace sample_driver
86ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace nn
87ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace android
88ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
89ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::nn::sample_driver::SampleDriverMinimal;
90ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::sp;
91ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet
92ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletint main() {
93ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    sp<SampleDriverMinimal> driver(new SampleDriverMinimal());
94ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet    return driver->run();
95ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}
96